为什么我可以对内联SELECT值进行排序,但不在WHERE子句中使用它?

时间:2009-04-28 10:04:41

标签: mysql sql mysql-error-1054

我有这个小的SQL查询。

SELECT a.`id` , a.`title` , a.`date` , 
(
    SELECT MAX( grade )
    FROM tests
    WHERE userid = 41
    AND presid = a.`id`
) AS grade
FROM `presentations` a
WHERE a.`visible` = 1
AND `grade` >= 5
ORDER BY `grade` DESC

这给了我错误

  

1054 - 'where子句'中的未知列'等级'

但如果我删除第二行,它可以正常工作。我试图做AND a.grade,甚至给测试表一个名字,并将该名称附加到等级但仍然没有运气。

如何在WHERE子句中使用此内联查询?

我发现这有效,但这是唯一的方法吗?

SELECT a.`id` , a.`title` , a.`date` , 
(
    SELECT MAX( grade )
    FROM tests
    WHERE userid = 41
    AND presid = a.`id`
) AS grade
FROM `presentations` a
WHERE a.`visible` = 1
AND (
    SELECT MAX( grade )
    FROM tests
    WHERE userid = 41
    AND presid = a.`id`
) >= 5
ORDER BY `grade` DESC

2 个答案:

答案 0 :(得分:5)

按照以下顺序对Sql语句进行了某种程度的评估:

  • FROM
  • WHERE
  • 选择
  • GROUP
  • HAVING
  • ORDER

因此,您在SELECT子句中定义的内容在WHERE子句中不可用。您需要将该约束放入HAVING子句中:

SELECT a.`id` , a.`title` , a.`date` , 
(
    SELECT MAX( grade )
    FROM tests
    WHERE userid = 41
    AND presid = a.`id`
) AS grade
FROM `presentations` a
WHERE a.`visible` = 1
HAVING `grade` >= 5
ORDER BY `grade` DESC

答案 1 :(得分:0)

SELECT  a.`id` , a.`title` , a.`date` , 
        (
        SELECT  MAX( grade )
        FROM    tests
        WHERE   userid = 41
                AND presid = a.`id`
       ) AS grade
FROM    `presentations` a
WHERE   a.`visible` = 1
HAVING  `grade` >= 5
ORDER BY
        `grade` DESC