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 BY
in 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 - 其他/合并列的控制顺序的主要内容,如果未能解决你的问题,请参考以下文章