В чем ошибка в этом sql


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

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

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

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

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

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

Author: Olli, 2011-03-24

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.

 5
Author: Justin Cave, 2011-03-24 15:23:17

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

SELECT * FROM leaderboard 
WHERE rownum <= '$limit' 
AND ALREADYWON != '1' 
ORDER BY Score
 2
Author: Mike Rifgin, 2011-03-24 15:13:24

Действительно ли это уже строка? Не следует ли в сравнении использовать вместо !=?

 1
Author: Lynn Crumbling, 2011-03-24 15:01:43

Я бы сказал, что != неверно и должно быть , чтобы быть допустимым запросом. Также я не знаю, но "$limit", возможно, должно быть ".$limit.".GL!

 0
Author: Younes, 2011-03-24 15:02:50

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

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

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

Кроме того, считается плохой практикой "ВЫБИРАТЬ *" для любой таблицы. Вы должны явно указывать имена столбцов.

Посмотрев на некоторые из ваших ответов, похоже, что вы пытаетесь получить ЛУЧШИЕ N записей. Для oracle это несколько способов их получения (вроде устаревших, но все равно должны работать).

 0
Author: StingyJack, 2011-03-24 15:07:19
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
Author: dseibert, 2011-03-24 15:15:56