多个GROUP_CONCAT列之间的顺序

时间:2020-07-22 11:29:59

标签: mysql database mariadb group-concat

我似乎找不到有关GROUP_CONCAT函数默认行为的任何信息,当我使用多个默认值时会出现问题,返回的值在它们之间是否具有相同的顺序?

对于此示例表和数据:

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `parentId` int(11) NOT NULL,
  `weight` int(11) NOT NULL,
  `color` varchar(7) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test` (`id`, `parentId`, `weight`, `color`) VALUES
(1, 1,  500,    '#aa11dd'),
(2, 1,  770,    '#ffffff'),
(3, 2,  100,    '#ff00ff'),
(4, 2,  123,    '#556677');

如果执行此操作,请选择:

SELECT `parentId`, 
        GROUP_CONCAT(`weight`), 
        GROUP_CONCAT(`color`), 
        GROUP_CONCAT(`id`) 
FROM `test` 
GROUP BY `parentId`

它返回:

parentId    GROUP_CONCAT(weight)    GROUP_CONCAT(color)     GROUP_CONCAT(id)
1           500,770                 #aa11dd,#ffffff         1,2
2           79798,123               #ff00ff,#556677         3,4

是否有可能例如在第一行中将值500,770翻转为770,500,但其余列保持不变(#aa11dd,#ffffff; 1,2)?我真的不关心整体顺序(DESC / ASC),我想知道的是,每一列是否总是与其他列相同?

2 个答案:

答案 0 :(得分:2)

ORDER BY函数中没有GROUP_CONCAT()子句的情况下,引擎可以自由地以任何顺序组合该值,并且该顺序随着时间的推移不稳定。每个GROUP_CONCAT()函数也可以具有不同的顺序。

为确保稳定的订购,请在ORDER BY函数内使用GROUP_CONCAT()

例如;

SELECT
  `parentId`, 
  GROUP_CONCAT(`weight` order by `id`), 
  GROUP_CONCAT(`color` order by `id`), 
  GROUP_CONCAT(`id` order by `id`) 
FROM `test` 
GROUP BY `parentId`

此示例按id对所有值进行排序,以确保稳定的已知顺序,并确保每一列始终具有与其他列相同的顺序。

答案 1 :(得分:1)

根据文档,您可以指定确切的顺序:

GROUP_CONCAT(DISTINCT `weight` ORDER BY `weight` ASC SEPARATOR ', ')

默认顺序未知