首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个GROUP_CONCAT列之间排序

在多个GROUP_CONCAT列之间排序
EN

Stack Overflow用户
提问于 2020-07-22 19:29:59
回答 2查看 72关注 0票数 0

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

对于本示例表和数据:

代码语言:javascript
复制
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');

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

代码语言:javascript
复制
SELECT `parentId`, 
        GROUP_CONCAT(`weight`), 
        GROUP_CONCAT(`color`), 
        GROUP_CONCAT(`id`) 
FROM `test` 
GROUP BY `parentId`

它返回:

代码语言:javascript
复制
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),我只想知道,每一列是否总是与其他列的顺序相同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-22 19:34:18

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

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

例如:

代码语言:javascript
复制
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对所有值进行排序,以确保一个稳定的已知顺序,并确保每一列始终与其他列具有相同的顺序。

票数 2
EN

Stack Overflow用户

发布于 2020-07-22 19:39:47

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

代码语言:javascript
复制
GROUP_CONCAT(DISTINCT `weight` ORDER BY `weight` ASC SEPARATOR ', ')

默认顺序未知

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63033175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档