119 mysql sql having having-clause
我需要在WHERE子句中使用别名,但它一直告诉我它是一个未知的列.有什么方法可以解决这个问题吗?我需要选择评级高于x的记录.评级计算如下:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
Run Code Online (Sandbox Code Playgroud)
Pau*_*xon 223
你可以使用HAVING子句 可以看到别名,例如
HAVING avg_rating>5
Run Code Online (Sandbox Code Playgroud)
但在where子句中你需要重复你的表达,例如
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
Run Code Online (Sandbox Code Playgroud)
但!并非所有表达式都被允许 - 使用像SUM这样的聚合函数将不起作用,在这种情况下,您将需要使用HAVING子句.
来自MySQL手册:
不允许在WHERE子句中引用列别名,因为在执行WHERE子句时可能尚未确定列值.请参见第B.1.5.4节"列别名的问题".
Tor*_*ing 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 ...
Run Code Online (Sandbox Code Playgroud)
这个问题很老了,一个答案已经获得了160票......
不过我还是要说清楚:问题实际上不在于是否可以在WHERE子句中使用别名。
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
Run Code Online (Sandbox Code Playgroud)
是一个聚合。在WHERE子句中,我们通过查看它们的值来限制我们想要从表中获取的记录。sum(reviews.rev_rating)并且count(reviews.rev_id),然而,不重视我们的记录找到; 它们是我们只有在汇总记录后才能获得的值。
所以WHERE是不合适的。我们需要HAVING,因为我们想在聚合后限制结果行。不可能
WHERE avg_rating > 10
Run Code Online (Sandbox Code Playgroud)
也不
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
Run Code Online (Sandbox Code Playgroud)
因此。
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
Run Code Online (Sandbox Code Playgroud)
另一方面是可能的并且符合 SQL 标准。然而
HAVING avg_rating > 10
Run Code Online (Sandbox Code Playgroud)
仅在 MySQL 中可能。根据标准,它不是有效的 SQL,因为该SELECT子句应该在HAVING. 来自 MySQL 文档:
标准 SQL 的另一个 MySQL 扩展允许在 HAVING 子句中引用选择列表中的别名表达式。
MySQL 扩展允许在聚合列的 HAVING 子句中使用别名
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html