你能在mysql的WHERE子句中使用别名吗?
-
03-07-2019 - |
题
我需要在WHERE子句中使用别名,但它一直告诉我它是一个未知的列。有什么方法可以解决这个问题吗?我需要选择评级高于x的记录。评级计算如下:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
解决方案
您可以使用HAVING子句,可以查看别名,例如
HAVING avg_rating>5
但在where子句中,您需要重复表达,例如
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
BUT!并非所有表达式都被允许 - 使用像SUM这样的聚合函数将不起作用,在这种情况下,您将需要使用HAVING子句。
来自 MySQL手册:
不允许引用a WHERE子句中的列别名, 因为列值可能尚未 在WHERE子句时确定 被执行。请参见第B.1.5.4节, “列别名的问题” 。
其他提示
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 ...
这个问题相当陈旧,一个答案已经获得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
如果您的查询是静态的,您可以将其定义为视图,然后您可以在查询视图时在where子句中使用该别名。