Mysql - GROUP_CONCAT - 其他/合并列的控制顺序

Posted

技术标签:

【中文标题】Mysql - GROUP_CONCAT - 其他/合并列的控制顺序【英文标题】:Mysql - GROUP_CONCAT - Control order of other / merged columns 【发布时间】:2018-09-03 02:32:11 【问题描述】:

给定这样的表格:

id     number     anotherNumber
1      1          10
2      1          20
3      2          20
4      2          10
5      3          10

如果我运行查询:

Select *, GROUP_CONCAT(number)
FROM docs
GROUP BY number

我会得到:

id  number  anotherNumber   GROUP_CONCAT(number)
1   1       10              1,1
3   2       20              2,2
5   3       10              3

see sql fiddle

但我想得到:

id  number  anotherNumber   GROUP_CONCAT(number)
1   1       20              1,1
3   2       20              2,2
5   3       10              3

基本上我希望anotherNumber 列中的数字按 DSEC 顺序排序 - 它应该始终是最高的。

我知道您可以添加 ORDER BYin the GROUP_CONCAT 但这只会影响连接的值,而不是“合并的值”。那么有没有简单的方法呢?

【问题讨论】:

按列聚合组很奇怪。为什么要这样做? 同意@TimBiegeleisen。结果将始终为number 重复COUNT(*) 次。除了以非常迂回的方式发现每个组中的记录数之外,还有什么意义? 恕我直言COUNT(*)GROUP_CONCAT(number) 更合适。相同的信息,更少的数据。 @tim 同意,但这是一个非常简化的示例,专注于该问题。在我的现实生活中,我正在加入表格等,并且 concat 组中的值不重复。 【参考方案1】:

你可以使用:

Select MIN(id) AS ID, number, MAX(anotherNumber) AS anotherNumber,
       GROUP_CONCAT(number)
FROM docs
GROUP BY number;

SQLFiddle Demo

您应该始终使用聚合函数包装 GROUP BY 中未指定的列(除非它们在功能上依赖于 GROUP BY 列并且您的 RDBMS 支持 ANSI-99 Optional feature T301, Functional dependencies)

【讨论】:

...除非它们在功能上依赖于number 列。 那是ANSI标准(Oracle除外)。 @TimBiegeleisen SQL Server 也不允许不在GROUP BY中的列 哦,是的。如果我按主键列分组,我可以选择该表中的 any 列,因为它们在功能上是相关的。在主要数据库中,只有 Oracle 没有遵循这一点,因为它真的很老派。 @TimBiegeleisen 你确定吗? Demo 或者我遗漏了一些明显的东西 SQL99 and later permits such nonaggregates per optional feature T301 if they are functionally dependent on GROUP BY columns 和 T301, Functional dependencies【参考方案2】:

以下代码是获得所需结果的简单方法:

SELECT id, number, MAX(anotherNumber) AS anotherNumber, GROUP_CONCAT(number)
FROM docs
GROUP BY number;

我还附上了我的SQLFiddle。

你可以检查一下。祝你好运!

【讨论】:

以上是关于Mysql - GROUP_CONCAT - 其他/合并列的控制顺序的主要内容,如果未能解决你的问题,请参考以下文章

mysql 将行转置为列

解决mysql中group_concat长度限制的方案

mysql 的group_concat方法

mysql用GROUP_CONCAT合并查询出现乱码?求大神!!!

mysql—group_concat函数

mysql查询结果拼接group_concat