是否可以使用MySQL将GROUP BY分成多列?


205

GROUP BYMySQL SELECT查询中是否可以有多个列?例如:

GROUP BY fV.tier_id AND 'f.form_template_id'

3
您不能按行分组。您可以按列,虽然集团
乔·菲利普斯


1
您可能需要执行子查询,而不是使用多个group by子句。
亚当F

尽管大多数投票的答案基本上彼此相同(它们显示正确的语法,并说明切换两列顺序的效果),但是如果您的需求有所不同,请考虑Daniklad的答案
制造商

Answers:



106

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

SELECT * FROM table
GROUP BY col1, col2

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


5
从左到右的首选项将应用于分组的升序,而不是列组的首选项。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请注意,在两种情况下都将返回行ID:2,2,2尽管它们会反转列。
fyrye

再进行一次测试。sqlfiddle.com/#!9/5c8763/2结论。最初,mysql按定义的第一个列(带有GROUP BY)进行排序。并且,如果在第一个定义的列中有相等的结果,则仅在相等的结果中按第二个定义的列排序
user2360831

关于SUM与一起使用GROUP BY。如果GROUP BY仅按一列,则将SUM每个不同(不同)列值sqlfiddle.com/#!9/1cbde2/2的所有值都设为s。如果GROUP BY两列。然后,mysql首先检查第一列的值是否在第二列中有不同的值。如果是,则mysql SUM第二列sqlfiddle.com/#!9/1cbde2/1的每个不同值。
user2360831

23

是的,但是按另外两列分组意味着什么?嗯,这与按每行唯一对进行分组相同。您列出列的顺序会更改行的排序方式。

在您的示例中,您将编写

GROUP BY fV.tier_id, f.form_template_id

同时,代码

GROUP BY f.form_template_id, fV.tier_id

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



13

举一个简单的例子,我有一个计数器,该计数器需要汇总站点上每个访问页面的唯一IP地址。基本上是按页面名称然后按IP分组。我将DISTINCT和GROUP BY结合起来解决了。

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

2
这个答案值得注意,因为它解决的问题与其他答案有所不同。
制造商

5

如果您希望同时使用两列分组(我需要应用此分组),那么我看到了这一点:

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

1
请在lada的答案下查看ypercube的评论。考虑作为替代:SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2。结果通常看起来与该答案相同,但是内部执行却大不相同。
制造商史蒂夫(Steve)

-2
GROUP BY CONCAT(col1, '_', col2)

37
我想知道在回答问题4年后发布的仅一行代码的答案如何获得8(八分!)票。同时除了迟到和短暂之外,也是不正确和低效的。
ypercubeᵀᴹ

8
@ypercubeᵀᴹ为什么说不正确?这正是我一直在寻找的东西,也是对“多列分组”的正确解释。实际上,我不知道为什么这不是我期望的“ group by col1,col2”行为
Abram

3
@Abram对您执行ping操作,以便您看到我对NeverEndingQueue的答复。缺点:效率比少得多-效率更低GROUP BY col1, col2。某些数据会给出错误的结果。说col1, col2有值:('a_b', 'c')一行一行('a', 'b_c')。使用GROUP BY CONCAT的错误答案会将两行汇总为一个。正确答案不会。
ypercubeᵀᴹ

1
没有人阻止你使用SELECT列表中CONCAT表达的方式,如果你需要它:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
ypercubeᵀᴹ

1
@ypercubeᵀᴹ哎呀,愚蠢的我在想“按foo分组,bar”的行为类似于“ ...按foo联合分组...按bar分组”。对于GROUP BY CONCAT来说确实是不寻常的情况。
亚伯兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.