0

请帮我解释为什么添加 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;
4

2 回答 2

0

COUNT是一个聚合函数,与其他聚合函数(如MIN、等)一样MAX,它SUM应用于组内的每个元素。

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

于 2013-10-02T13:57:50.190 回答
0

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

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

可悲的是,我对 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

希望这不会使查询太慢!

于 2014-09-01T16:16:43.900 回答