【问题标题】:MySQL GROUP_CONCAT Rearranges valuesMySQL GROUP_CONCAT 重新排列值
【发布时间】:2017-08-25 16:36:55
【问题描述】:

假设我有下表:

ID|Col1    |Col2
1 |Test1   |Test12
2 |Test2   |Test22
2 |Test3   |Test32

当我使用如下查询时:

SELECT GROUP_CONCAT(Col1) as First, GROUP_CONCAT(Col2) as Second WHERE ID=2 GROUP BY ID

它有时会返回重新排列的 GROUP_CONCAT。例如:

ID|First      |Second
2 |Test2,Test3|Test32,Test22

虽然我希望它会返回:

ID|First      |Second
2 |Test2,Test3|Test22,Test32

如您所见,它切换了名为“Second”的列中的连接值。我怎样才能防止这种情况发生?

【问题讨论】:

  • 使用GROUP_CONCAT(Col2 ORDER BY Col2)GROUP_CONCAT 返回的顺序是 arbitray,因为 SQL 表中没有固有顺序。
  • 您在哪里指定了订购方式?
  • @BoundaryImposition 我假设 GROUP_CONCAT 会通过附加找到的行(如 row1、row2、row3 等)来返回它。但显然它不会
  • 就是它的作用。但是您没有指定顺序。
  • @BoundaryImposition,至少并非总是如此。因为那样它就不会像我的示例中那样返回结构

标签: mysql group-concat arrangeoverride


【解决方案1】:

如果您希望这些值按特定顺序排列,请使用order by

SELECT GROUP_CONCAT(Col1 ORDER BY Col1) as First,
       GROUP_CONCAT(Col2 ORDER BY col2) as Second
FROM t
WHERE ID = 2
GROUP BY ID;

一般来说,SQL 处理 无序 集合。如果您希望按特定顺序排列,则需要明确指定顺序。

【讨论】:

  • 这仅在列中的值具有与 A-B-C A-B-C 相同的排序结构的情况下才有效。当它是 A-B-C B-A-C 时,它会失败吗?
  • @TVAvanHesteren 。 . .这将以规范的顺序返回值——按字母顺序。如果您有另一列指定排序,您可以在ORDER BY 中使用它。
  • 我想要实现的是 CONCAT_GROUP Col2 以与我目前无法实现的 CONCAT_GROUP Col1 相同的顺序返回值。我尝试在 Col1 上对两者进行排序,两者都在他们自己的列表中,因此 Col2 by Col2,Col1 by Col1。但它仍然不会匹配返回组的索引中找到的行
【解决方案2】:

此表缺少要在 group_concat 中排序的公共列 (PK)。

ID|组ID|Col1 |Col2

1|1 |测试1 |测试12

2|2 |Test2 |Test22

3|2 |Test3 |Test32

SELECT GROUP_CONCAT(Col1 ORDER BY ID) as First,
       GROUP_CONCAT(Col2 ORDER BY ID) as Second
FROM t
WHERE GroupID = 2
GROUP BY GroupID;

这将保留 col1 和 col2 的组 concat 的顺序。

【讨论】:

  • 是的,但我没有添加另一列的选项。为 GROUP_CONCAT 中的订单 +1,但没有意识到这是可能的
猜你喜欢
  • 2012-07-14
  • 2010-11-02
  • 2015-09-26
  • 1970-01-01
  • 2011-06-01
  • 2011-02-25
  • 2013-04-12
  • 2016-10-16
相关资源
最近更新 更多