多个 GROUP_CONCAT 列之间的顺序

Mir*_*ous 2 mysql database group-concat mariadb

我似乎找不到有关 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');
Run Code Online (Sandbox Code Playgroud)

如果我这样做选择:

SELECT `parentId`, 
        GROUP_CONCAT(`weight`), 
        GROUP_CONCAT(`color`), 
        GROUP_CONCAT(`id`) 
FROM `test` 
GROUP BY `parentId`
Run Code Online (Sandbox Code Playgroud)

它返回:

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

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

The*_*ler 5

如果函数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`
Run Code Online (Sandbox Code Playgroud)

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