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),我想知道的是,每列是否始终与其他列具有相同的顺序?
如果函数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确保稳定、已知的顺序,并确保每列始终与其他列具有相同的顺序。