首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL - GROUP BY更改结果

MySQL - GROUP BY更改结果
EN

Stack Overflow用户
提问于 2013-10-02 21:52:26
回答 2查看 219关注 0票数 0

请解释一下为什么添加GROUP BY子句会改变查询结果。在其他条件保持不变的情况下,删除GROUP BY子句将产生与添加GROUP BY子句不同的结果。

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

我需要按table2.name组织数据,并获取每个数据的计数

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2013-10-02 21:57:50

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-09-02 00:16:44

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

table2.name

  • COUNT(*)

  • COUNT(DISTINCT(op.id))
  • GROUP

遗憾的是,我对MySQL的内部工作原理知之甚少,不知道为什么它会产生这样的效果,但我确实知道如何修复它。

解决方案是子选择,即

代码语言:javascript
复制
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

希望这不会使查询太慢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19138578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档