首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql -基于字段值的Concat字段

Mysql -基于字段值的Concat字段
EN

Stack Overflow用户
提问于 2018-02-27 00:20:40
回答 2查看 79关注 0票数 1

给出这样的桌子:

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

你会如何将它转换成这样:

代码语言:javascript
复制
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,则不应执行任何操作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-27 00:27:25

我要做的是:

代码语言:javascript
复制
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的行都算作一个不同的组。

关于你的评论:

您还可以在查询中初始化一个变量,如下所示:

代码语言:javascript
复制
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);
票数 3
EN

Stack Overflow用户

发布于 2018-02-27 00:47:20

GROUP_CONCAT可以用于将来自不同行的数据聚合到一个连在一起的字符串中(如其名称所示);它还支持并按其自己的子句排序,因此您需要加倍确保相应的值最终位于列表*的相同相对位置。

代码语言:javascript
复制
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)的方法进行补救。

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

https://stackoverflow.com/questions/48999212

复制
相关文章

相似问题

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