В чем ошибка в этом sql - PullRequest
2 голосов
/ 24 марта 2011

Что не так с этим запросом:

SELECT * FROM leaderboard WHERE ALREADYWON != '1' ORDER BY Score LIMIT 0,'$limit'

Код после того, как он просто выдает ошибки:

Warning: Invalid argument supplied for foreach() in file ...

$limit определенно имеет значение, я просто повторяю егодо.Я использую Oracle.

Может кто-нибудь определить синтаксическую ошибку?

Ответы [ 6 ]

5 голосов
/ 24 марта 2011

Oracle не поддерживает ключевое слово LIMIT. Эквивалентная конструкция в Oracle будет выглядеть примерно так:

SELECT *
  FROM (SELECT *
          FROM leaderboard
         WHERE AlreadyWon != '1'
         ORDER BY score)
 WHERE rownum <= <<limit>>

Обратите внимание, что это НЕ эквивалентно запросу

SELECT *
  FROM leaderboard
 WHERE AlreadyWon != '1'
   AND rownum <= <<limit>>
 ORDER BY score

Первый запрос получает первые <<limit>> строк в порядке SCORE. Второй запрос получает произвольный набор <<limit>> строк и порядков, которые произвольно установлены, поскольку фильтр ROWNUM применяется перед предложением ORDER BY.

2 голосов
/ 24 марта 2011

ORACLE не поддерживает LIMIT.Я должен был использовать этот запрос

SELECT * FROM leaderboard 
WHERE rownum <= '$limit' 
AND ALREADYWON != '1' 
ORDER BY Score
1 голос
/ 24 марта 2011

ALREADYWON действительно строка?Разве для сравнения не следует использовать <> вместо! =?

0 голосов
/ 24 марта 2011
SELECT * FROM 
   (SELECT score, ROW_NUMBER() OVER (ORDER BY score) R FROM leaderboard WHERE alreadywon != 1)
   WHERE R BETWEEN 0 and '$Limit';

Это позволит вам получать заказанные баллы, но до указанного вами лимита. Будьте осторожны, так как это кандидат на SQL-инъекцию. Вы можете вместо этого заглянуть в параметризованные запросы PHP.

0 голосов
/ 24 марта 2011

Я бы сказал, что! = Неверно и должно быть <>, чтобы быть действительным запросом.Также я не знаю, но «$ limit», возможно, должно быть «. $ Limit.».GL!

0 голосов
/ 24 марта 2011

Проблема заключается в смешивании PHP в оператор SQL.Все, что после этого ...

SELECT * FROM leaderboard WHERE ALREADYWON != '1' ORDER BY Score

..., вероятно, будет причиной вашей ошибки

Кроме того, считается "плохим" выбором для SELECT * для любой таблицы.Вы должны явно именовать столбцы.

Изучив некоторые ваши ответы, похоже, что вы пытаетесь получить TOP N записей.Для оракула, это - это несколько способов получить их (от даты, но все еще должно работать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...