【问题标题】:How to use a temp column in the where clause如何在 where 子句中使用临时列
【发布时间】:2010-10-12 11:06:04
【问题描述】:

为什么不能在 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' 

【问题讨论】:

    标签: mysql sql mysql-error-1054


    【解决方案1】:

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

    如果您想使用该名称访问该列,则必须使用子查询,否则您将不得不在没有您给它的名称的情况下限定该列,重复您的 case 语句。

    【讨论】:

      【解决方案2】:

      改用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
      

      WHEREGROUP BY 之前评估HAVING 在之后进行评估。

      【讨论】:

      • @thorn:它在 MySQL 中一直对我有用。也许您的查询中还有其他问题?您正在运行哪个版本的 MySQL,您是否启用了其中一个严格选项?
      • 对不起。我将 MySQL 与 MS SQL Server 混淆了。
      【解决方案3】:

      因为在 SQL 中,列首先是“选定的”,然后是“投影的”。

      【讨论】:

      • 这比我试图解释的要简洁得多:)
      • 感谢 TheTXI :P,为他们终于获得回报的 DB 设计课程欢呼。
      【解决方案4】:

      你必须使用完整的子句,所以你需要:

      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
      

      会的。你的情况也一样。

      【讨论】:

        【解决方案5】:

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

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

        这将为您提供所有具有count > 50product_brands 并且还会向您显示 每个的计数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-14
          • 2010-12-25
          • 1970-01-01
          • 2011-08-24
          • 2014-08-28
          • 2020-12-19
          • 2020-05-14
          相关资源
          最近更新 更多