В чем ошибка в этом sql
Что не так с этим запросом:
SELECT * FROM leaderboard WHERE ALREADYWON != '1' ORDER BY Score LIMIT 0,'$limit'
Код после этого просто выдает ошибки:
Warning: Invalid argument supplied for foreach() in file ...
$limit
определенно имеет значение, я повторяю это только что. Я использую Oracle.
Может ли кто-нибудь обнаружить синтаксическую ошибку?
6 answers
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>>
и упорядочивает этот произвольный набор, поскольку фильтр ЧИСЛА СТРОК применяется перед предложением ORDER BY.
ORACLE не поддерживает LIMIT. Я должен был использовать этот запрос
SELECT * FROM leaderboard
WHERE rownum <= '$limit'
AND ALREADYWON != '1'
ORDER BY Score
Действительно ли это уже строка? Не следует ли в сравнении использовать вместо !=?
Я бы сказал, что != неверно и должно быть , чтобы быть допустимым запросом. Также я не знаю, но "$limit", возможно, должно быть ".$limit.".GL!
Проблема заключается в смешивании PHP с инструкцией SQL. Все, что после этого...
SELECT * FROM leaderboard WHERE ALREADYWON != '1' ORDER BY Score
... скорее всего, это будет причиной вашей ошибки
Кроме того, считается плохой практикой "ВЫБИРАТЬ *" для любой таблицы. Вы должны явно указывать имена столбцов.
Посмотрев на некоторые из ваших ответов, похоже, что вы пытаетесь получить ЛУЧШИЕ N записей. Для oracle это несколько способов их получения (вроде устаревших, но все равно должны работать).
SELECT * FROM
(SELECT score, ROW_NUMBER() OVER (ORDER BY score) R FROM leaderboard WHERE alreadywon != 1)
WHERE R BETWEEN 0 and '$Limit';
Это позволит вам упорядочить баллы, но до указанного вами предела. Однако будьте осторожны, так как это кандидат для внедрения SQL. Возможно, вы захотите вместо этого изучить параметризованные запросы PHP.