【问题标题】:mysql 1111 invalid use of group functionmysql 1111 无效使用组函数
【发布时间】:2018-10-12 16:02:21
【问题描述】:

这个查询工作得很好:

SELECT leads.contact_id, count(leads.contact_id) as orders 
FROM leads
WHERE leads.status="sold" 
GROUP BY leads.contact_id    

但是这个没有。为什么?

SELECT leads.contact_id, count(leads.contact_id) as orders
FROM leads
WHERE orders > 1 and leads.status="sold" 
GROUP BY leads.contact_id    

执行此查询时出现错误

1054 - 'where 子句'中的未知列 'orders'

即使将 orders 替换为 count(leads.contact_id) 也不起作用:

SELECT leads.contact_id, count(leads.contact_id) as orders
FROM leads
WHERE count(leads.contact_id) > 1 and leads.status="sold" 
GROUP BY leads.contact_id 

返回以下错误信息:

1111 - 组函数使用无效

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果您了解 SQL 的操作顺序,您就会知道为什么您的查询不起作用。

    FROM clause
    WHERE clause
    GROUP BY clause
    HAVING clause
    SELECT clause
    ORDER BY clause
    

    WHERE 子句在 SELECTGROUP BY 之前评估。所以它不会知道count(leads.contact_id)orders 是什么。 HAVINGGROUP BY 之后评估。它用于过滤聚合。

    SELECT leads.contact_id, count(leads.contact_id) as orders 
    FROM leads
    WHERE leads.status="sold" 
    GROUP BY leads.contact_id  
    HAVING orders > 1
    

    【讨论】:

      【解决方案2】:

      我应该使用 HAVING 而不是 WHERE 因为 WHERE 只能用于过滤原始数据表而不是计算出来的。然而列 count(leads.contact_id)orders 是计算列而不是表的原始列,因此我必须像这样使用 HAVING 才能使其工作:

      SELECT leads.contact_id, count(leads.contact_id) as orders 
      FROM leads
      WHERE leads.status="sold" 
      GROUP BY leads.contact_id  
      HAVING orders>1
      

      另见detailed explanation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 2021-11-21
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多