我需要在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子句中使用该别名。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top