这个sql中的错误是什么

时间:2011-03-24 15:00:07

标签: php sql oracle

此查询有什么问题:

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

之后的代码只是抛出错误:

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

$limit肯定有一个价值,我刚刚回应它。我正在使用Oracle。

有人能发现语法错误吗?

6 个答案:

答案 0 :(得分:5)

Oracle不支持LIMIT关键字。 Oracle中的等效构造类似于

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

请注意, NOT 等同于查询

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

第一个查询根据<<limit>>顺序获取第一个SCORE行。第二个查询获取任意一组<<limit>>行和任意设置的订单,因为在ORDER BY子句之前应用了ROWNUM过滤器。

答案 1 :(得分:2)

ORACLE不支持LIMIT。我不得不使用这个查询

SELECT * FROM leaderboard 
WHERE rownum <= '$limit' 
AND ALREADYWON != '1' 
ORDER BY Score

答案 2 :(得分:1)

ALREADYWON真的是一个字符串吗?比较不应该使用&lt;&gt;而不是!=?

答案 3 :(得分:0)

将PHP混合到SQL语句中是个问题。在此之后的一切......

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

...可能是您错误的原因

此外,对于任何表格来说,它都被认为是“SELECT *”。您应该明确命名列。

在查看了一些回复之后,看起来您正试图获得TOP N记录。对于oracle来说,this是获得它们的一些方法(有点过时,但应该仍然有用)。

答案 4 :(得分:0)

我会说!=错了,应该是&lt;&gt;是一个有效的查询。我也不知道,但'$ limit'应该是'“。$ limit。”'。 GL!

答案 5 :(得分:0)

SELECT * FROM 
   (SELECT score, ROW_NUMBER() OVER (ORDER BY score) R FROM leaderboard WHERE alreadywon != 1)
   WHERE R BETWEEN 0 and '$Limit';

这将获得您订购的分数,但最高可达您指定的限制。但要小心,因为这是SQL注入的候选者。您可能希望改为查看PHP参数化查询。