【问题标题】:Mysql - GROUP_CONCAT - Control order of other / merged columnsMysql - GROUP_CONCAT - 其他/合并列的控制顺序
【发布时间】: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 组中的值不重复。

标签: mysql sql-order-by group-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 columnsT301, Functional dependencies
【解决方案2】:

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

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

我还附上了我的SQLFiddle

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

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 2020-09-19
    • 2018-11-19
    • 1970-01-01
    • 2012-03-01
    • 2021-03-14
    • 2012-04-19
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多