给出这样的桌子:
id name field
1 walt a
2 hurley b
3 jack c
4 kate a
5 sawyer a
6 john a
7 ben b
8 miles null
9 juliet c
10 jacob d
11 richard null你会如何将它转换成这样:
id ids names field
1 1,4,5,6 walt, kate, sawyer, john a
2 2,7 hurley, ben b
3 8 miles null
4 3,9 jack, juliet c
5 10 jacob d
6 11 richard null它需要查看所有具有相同字段值的行。然后,它需要根据字段值的相等“合并”所有其他值。但是,如果字段值为null,则不应执行任何操作。
发布于 2018-02-27 00:27:25
我要做的是:
mysql> set @x:= 1;
mysql> select group_concat(id) as ids, group_concat(name) as names, field
from `a table like this` group by coalesce(field, @x:=@x+1);
+---------+-----------------------+-------+
| ids | names | field |
+---------+-----------------------+-------+
| 8 | miles | NULL |
| 11 | richard | NULL |
| 1,4,5,6 | walt,kate,sawyer,john | a |
| 2,7 | hurley,ben | b |
| 3,9 | jack,juliet | c |
| 10 | jacob | d |
+---------+-----------------------+-------+基本上,我诱使查询将每个NULL作为一个非空值来处理,该值在每次计算时都会增加,因此每一行带NULL的行都算作一个不同的组。
关于你的评论:
您还可以在查询中初始化一个变量,如下所示:
select group_concat(id) as ids, group_concat(name) as names, field
from (select @x:=1) AS _init
cross join `a table like this`
group by coalesce(field, @x:=@x+1);发布于 2018-02-27 00:47:20
GROUP_CONCAT可以用于将来自不同行的数据聚合到一个连在一起的字符串中(如其名称所示);它还支持并按其自己的子句排序,因此您需要加倍确保相应的值最终位于列表*的相同相对位置。
SELECT MIN(id)
, GROUP_CONCAT(id ORDER BY id)
, GROUP_CONCAT(name ORDER BY id)
, field
FROM theTable
WHERE field IS NOT NULL
GROUP BY field
UNION
SELECT id, id, name, field
FROM theTable
WHERE field IS NULL
;*聚合函数忽略空值,因此从技术上说,如果id或name包含空值,列表就会出现对齐;这可以通过类似于GROUP_CONCAT(IFNULL(concatenated_value, '[null]') ORDER BY ordering_value)的方法进行补救。
https://stackoverflow.com/questions/48999212
复制相似问题