在多个 GROUP_CONCAT 列之间排序

Order between multiple GROUP_CONCAT columns

我似乎找不到任何关于 GROUP_CONCAT 函数默认行为的信息,当我使用其中的多个时,返回值之间的顺序是否相同?

对于此示例 table & 数据:

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:

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

它returns:

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),我只想知道,如果每一列的顺序始终与其他列相同?

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

为了确保稳定的排序,请在 GROUP_CONCAT() 函数中使用 ORDER BY

例如;

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 对所有值进行排序,以确保稳定、已知的顺序,并确保每一列的顺序始终与其他列相同。

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

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

默认顺序未知