MySQL - GROUP BY更改结果

时间:2013-10-02 13:52:26

标签: mysql sql group-by

请帮我解释为什么添加GROUP BY子句会更改查询的结果。所有其他保持不变,删除GROUP BY子句将产生与添加GROUP BY子句不同的结果。

在我看来,GROUP BY只是按字段对结果进行分组,而不是改变计数。

我需要通过table2.name组织数据,并获取每个

的计数
SELECT table2.name, COUNT(DISTINCT(op.id))
FROM op INNER JOIN table1 ON table1.EID = op.ID
    INNER JOIN table3 ON table3.id = table1.jobid
    INNER JOIN table2 ON table2.id = table3.CatID
WHERE op.ActiveStartDate <= NOW()
    AND op.ActiveEndDate >= NOW()
GROUP BY table2.name
ORDER BY COUNT(*) DESC;

2 个答案:

答案 0 :(得分:0)

COUNT是一个聚合函数,与其他聚合函数(如MINMAXSUM等一样,应用于组中的每个元素。

MySql比其他数据库更灵活一点,因为它允许您在没有COUNT(*)的情况下使用GROUP BY:这在例如SQL Server或Oracle。

答案 1 :(得分:0)

这是因为所有GROUP BY操作都在任何ORDER BY操作之前应用。但是在上面的例子中,你在ORDER子句中有一个分组函数。这意味着实际上在结果数据集的ORDER BY之前应用了3个分组:

  • COUNT(DISTINCT(op.id))
  • GROUP BY table2.name
  • COUNT(*)

可悲的是,我对MySQL的内部工作原理知之甚少,不知道为什么它具有确切的效果,但我确实知道如何解决它。

解决方案是子SELECT,即

SELECT *
FROM (
    SELECT
        table2.name,
        COUNT(DISTINCT(op.id)),
        COUNT(*) as c
    FROM op 
        JOIN table1 ON table1.EID = op.ID
        JOIN table3 ON table3.id = table1.jobid
        JOIN table2 ON table2.id = table3.CatID
    WHERE
        op.ActiveStartDate <= NOW()
        AND op.ActiveEndDate >= NOW()
    GROUP BY
        table2.name
) AS t
ORDER BY
    t.c DESC

希望这不会让查询太慢!