Is it possible to GROUP BY multiple columns using MySQL?
在MySQL SELECT查询中是否可以GROUP BY多个列? 例如:
-
您不能按行分组。 您可以按列分组
-
这个语法版本是什么:stackoverflow.com/questions/2421388/…
-
您可能需要执行子查询而不是使用多个group by子句。
-
虽然大多数高投票的答案基本上彼此相同(它们显示正确的语法,并解释了切换两列顺序的效果),但如果您的需求有所不同,请考虑Daniklad的答案。
是的,您可以按多列进行分组。 例如,
结果首先按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。
-
是的,Mysql给了我们不正确的结果
-
还有一个测试。 sqlfiddle.com/#!9/5c8763/2结论。首先,mysql按第一个定义的列(使用GROUP BY)进行排序。如果在第一个定义的列中有相同的结果,那么只有在相同的结果中才能按第二个定义的列进行排序
-
关于SUM与GROUP BY一起使用。如果GROUP BY只有一列,那么SUM每个不同(不同)列值sqlfiddle.com/#!9/1cbde2/2的所有值。如果GROUP BY两列。然后mysql首先检查第一列的值是否在第二列中有不同的值。如果是,则mysql SUM第二列sqlfiddle.com/#!9/1cbde2/1的每个不同值。
是的,但更多两列的分组是什么意思? 嗯,它与每行每个唯一对的分组相同。 列出列的顺序会更改行的排序方式。
在你的例子中,你会写
GROUP BY fV.tier_id, f.form_template_id
同时,代码
GROUP BY f.form_template_id, fV.tier_id
会给出类似的结果,但排序方式不同。
为了使用一个简单的例子,我有一个计数器,需要总结站点上每个访问页面的唯一IP地址。 这基本上是按页面名称分组,然后是IP分组。 我用DISTINCT和GROUP BY的组合解决了这个问题。
-
这个答案值得注意,因为它解决了与其他答案有些不同的问题。
如果你喜欢(我需要同时应用这个)组两个列,我只是看到了这一点:
-
在lada的回答下看到ypercube的评论。考虑作为替代方案:SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2。结果通常与此答案看起来相同,但内部执行却完全不同。
-
我想知道在回答问题4年后发布的只有一行代码的答案会得到8(8!)个赞成票。虽然从短期到短期也是不正确和低效的。
-
即使是一只盲目的松鼠也时不时地得到坚果......
-
@ypercube?为什么你说这是不正确的?这正是我所寻找的,以及对"按多列分组"的正确解释。事实上,我不知道为什么这不是像我期望的那样"col1,col2组"的行为
-
@NeverEndingQueue我不是你一直在寻找的东西,但GROUP BY CONCAT(col1, '_', col2)与``GROUP BY col1,col2`相比有许多缺点。
-
@Abram ping你,所以你看到我对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?哎呀,愚蠢地我在想"group by foo,bar"表现得像"...... foo union group by group by bar"。这对GROUP BY CONCAT来说确实是一个不寻常的案例。