如何在where子句中使用临时列

时间:2009-03-10 15:37:45

标签: mysql sql mysql-error-1054

为什么我不能在where子句中使用临时列?

例如,此查询:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
    1 
GROUP BY 
    product_brand

这会打开两列,一列名为product_brand,另一列名为brand_countbrand_count即时创建,始终为1或0,具体取决于是否有50个或具有该品牌的产品。

所有这一切对我都有意义,除了我不能只选择brand_count = 1,如下面的查询:

Select 
    product_brand, 
   (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
   brand_count = 1 
GROUP BY 
   product_brand

这给了我这个错误:

#1054 - Unknown column 'brand_count' in 'where clause' 

5 个答案:

答案 0 :(得分:14)

改为使用HAVING

Select
    product_brand,
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count
  FROM products
  GROUP BY product_brand
  HAVING brand_count = 1

WHERE在<{em> GROUP BY之前评估HAVING在{。<}后评估。

答案 1 :(得分:2)

因为在SQL中,列首先“选中”然后“投射”。

答案 2 :(得分:2)

您必须使用完整子句,因此您需要:

Select 
  product_brand, 
  (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM products 
WHERE 
  (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END)  = 1 
GROUP BY product_brand

对于任何SQL语句中的任何计算字段,这都是相同的。

简化:

Select Max(Points) as Highest where Highest > 10

不起作用,但是:

Select Max(Points) as Highest where Max(Points) > 10

意愿。你的情况也一样。

答案 3 :(得分:0)

因为在完成处理之前它不知道该列是什么。

如果要按该名称访问该列,则必须使用子查询,否则您将不必使用您提供的名称来限定该列,重复您的案例陈述。

答案 4 :(得分:0)

如果我正确阅读了您的意图,您可以重新编写此查询以阅读:

Select 
 product_brand,
 COUNT(product_brand) AS brand_count 
FROM 
 products 
GROUP BY 
 product_brand
HAVING 
 COUNT(product_brand) > 50

这将为您提供product_brands的所有count > 50,并向您展示 每个的计数。