【问题标题】:Is it possible to GROUP BY multiple columns using MySQL?是否可以使用 MySQL 对多个列进行 GROUP BY?
【发布时间】:2010-12-22 22:08:00
【问题描述】:

是否可以在 MySQL SELECT 查询中 GROUP BY 多于一列?例如:

GROUP BY fV.tier_id AND 'f.form_template_id'

【问题讨论】:

  • 您不能按行分组。您可以按列分组
  • 这是什么语法版本:stackoverflow.com/questions/2421388/…
  • 您可能需要进行子查询,而不是使用多个 group by 子句。
  • 虽然大多数高票答案基本上是相同的(它们显示了正确的语法,并解释了切换两列顺序的效果),但如果您的需要有些不同,考虑Daniklad's answer

标签: mysql sql group-by


【解决方案1】:
GROUP BY col1, col2, col3

【讨论】:

    【解决方案2】:

    是的,您可以按多列分组。例如,

    SELECT * FROM table
    GROUP BY col1, col2
    

    结果将首先按 col1 分组,然后按 col2 分组。在 MySQL 中,列首选项从左到右。

    【讨论】:

    • 从左到右的首选项应用于分组的升序,而不是列组首选项。 GROUP BY 适用于 col1+col2。例如col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2 并运行 GROUP BY col1,col2 将返回 1,1|1,3|2,2,而不是建议的 1,1|2,2。而GROUP BY col2, col1 会改变 col2 返回的升序。 1,1|2,2|1,3 演示:sqlfiddle.com/#!9/d5f69/1 请注意,尽管反转了列,但 2,2 在两种情况下都会返回行 ID:2。
    • 再测试一次。 sqlfiddle.com/#!9/5c8763/2 结论。首先mysql按第一个定义的列(GROUP BY)排序。如果在第一个定义的列中有相等的结果,那么只有在相等的结果中才按第二个定义的列排序
    • 关于SUMGROUP BY 一起使用。如果GROUP BY 仅减一列,则SUMs 的所有值的每个不同(不同)列值sqlfiddle.com/#!9/1cbde2/2。如果GROUP BY 两列。然后mysql首先检查第一列值是否在第二列中有不同的值。如果是,则mysqlSUM第二列的每个不同值sqlfiddle.com/#!9/1cbde2/1
    【解决方案3】:

    是的,但是多两列分组是什么意思?好吧,这与按每行的每个唯一对分组相同。您列出列的顺序会改变行的排序方式。

    在你的例子中,你会写

    GROUP BY fV.tier_id, f.form_template_id

    同时,代码

    GROUP BY f.form_template_id, fV.tier_id

    会给出相似的结果,但排序不同。

    【讨论】:

      【解决方案4】:
      group by fV.tier_id, f.form_template_id
      

      【讨论】:

        【解决方案5】:

        举一个简单的例子,我有一个计数器,需要汇总网站上每个访问页面的唯一 IP 地址。这基本上是按页面名分组,然后按 IP 分组。我通过 DISTINCT 和 GROUP BY 的组合解决了这个问题。

        SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;
        

        【讨论】:

        • 这个答案值得注意,因为它解决的问题与其他答案有些不同。
        【解决方案6】:

        如果您更喜欢(我需要应用此功能)同时按两列分组,我刚刚看到了这一点:

        SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1
        

        【讨论】:

        • 在 lada 的回答下查看 ypercube 的 cmets。考虑作为替代方案:SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2。结果通常看起来与此答案相同,但内部执行却大不相同。
        【解决方案7】:
        GROUP BY CONCAT(col1, '_', col2)
        

        【讨论】:

        • 我想知道在回答问题 4 年后发布的仅一行代码的答案如何获得 8(八!)个赞成票。同时也是不正确和低效的,除了迟到和短。
        • @ypercubeᵀᴹ 你为什么说它不正确?这正是我一直在寻找的,也是对“按多列分组”的正确解释。事实上,我不知道为什么这不是我所期望的“group by col1, col2”的行为
        • @Abram 正在联系您,所以您可以看到我对 NeverEndingQueue 的回复。缺点:它比GROUP BY col1, col2 效率低得多。某些数据会给出错误的结果。假设col1, col2 有值:('a_b', 'c') 在一行中,('a', 'b_c') 在另一行中。这个错误的答案,使用 GROUP BY CONCAT 会将两行聚合为一个。正确答案不会。
        • 没有人阻止你顺便在SELECT列表中使用CONCAT表达式,如果你需要的话:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
        • @ypercubeᵀᴹ 哎呀,我愚蠢地认为“按 foo 分组,bar”表现得像“...按 foo union 分组 ...按 bar 分组”。对于 GROUP BY CONCAT 来说,这确实是一个不寻常的案例。
        猜你喜欢
        • 2016-10-26
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多