我需要在WHERE子句中使用别名,但它一直告诉我它是一个未知的列。有什么方法可以解决这个问题吗?我需要选择评级高于x的记录。评级计算如下:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
答案 0 :(得分:213)
您可以使用HAVING子句,可以查看别名,例如
HAVING avg_rating>5
但在where子句中,您需要重复表达,例如
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
BUT!并非所有表达式都被允许 - 使用像SUM这样的聚合函数将不起作用,在这种情况下,您将需要使用HAVING子句。
来自MySQL Manual:
不允许引用a WHERE子句中的列别名, 因为列值可能尚未 在WHERE子句时确定 被执行。请参阅Section B.1.5.4, “Problems with Column Aliases”。
答案 1 :(得分:31)
Dunno如果这在mysql中工作但是使用sqlserver你也可以像下面一样包装它:
select * from (
-- your original query
select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
from ...) Foo
where Foo.avg_rating ...
答案 2 :(得分:3)
这个问题相当陈旧,一个答案已经获得160票......
我仍然会说清楚:问题实际上不是否可以在WHERE
子句中使用别名。
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
是一个聚合。在WHERE
子句中,我们通过查看它们的值来限制我们想要的记录。但是,sum(reviews.rev_rating)
和count(reviews.rev_id)
不是我们在记录中找到的值;它们是我们在汇总记录后才得到的值。
所以WHERE
不恰当。我们需要HAVING
,因为我们希望在聚合后限制结果行。它不可能
WHERE avg_rating > 10
,也不
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
因此
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
另一方面,是可能的,并符合SQL标准。而
HAVING avg_rating > 10
只能在MySQL中使用。根据标准,它不是有效的SQL,因为SELECT
子句应该在HAVING
之后执行。来自MySQL文档:
标准SQL的另一个MySQL扩展允许HAVING子句中的引用到选择列表中的别名表达式。
MySQL扩展允许在聚合列的HAVING子句中使用别名
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
答案 3 :(得分:0)
如果您的查询是静态的,您可以将其定义为视图,然后您可以在查询视图时在where子句中使用该别名。
答案 4 :(得分:0)
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
WHERE gender = 'F') AS c
WHERE c.custId = 100;