如何在MySQL中使用GROUP BY将字符串连接起来?

449

基本上问题是如何从这个表格:

foo_id   foo_name
1        A
1        B
2        C

转换成这个表格:

foo_id   foo_name
1        A B
2        C

3
@barlop 通过编辑问题和答案解决了这个问题。 - ustun
6个回答

666

谢谢!这节省了我很多时间,干杯! - user752746

171
SELECT id, GROUP_CONCAT( string SEPARATOR ' ') FROM table GROUP BY id

更多细节请点击这里

从上面的链接中,GROUP_CONCAT函数返回一个字符串结果,其中包含组中连接非NULL值。如果没有非NULL值,则返回NULL。


生成的列在字符方面有限制。请参见此处和文档。 :) - marlo
不是foo_id吗? - tolga

23
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;
在MySQL中,您可以获取表达式组合的连接值。要消除重复值,请使用DISTINCT子句。要对结果中的值进行排序,请使用ORDER BY子句。要以相反的顺序排序,请在ORDER BY子句中按照您要排序的列的名称添加DESC(降序)关键字。默认是升序;可以使用ASC关键字明确指定。在分组中值之间的默认分隔符是逗号(“,”)。要显式指定分隔符,请使用SEPARATOR后跟应插入在组值之间的字符串文本值。为了完全消除分隔符,请指定SEPARATOR ''
GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

或者

mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;

21

结果被截断为由group_concat_max_len系统变量给出的最大长度,其默认值为1024个字符,因此我们首先执行以下操作:

SET group_concat_max_len=100000000;

然后,例如:

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id

1
结果被截断到由group_concat_max_len系统变量给出的最大长度,该变量具有默认值1024个字符。[文档](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat) - marlo
这个group_concat_max_len配置的作用范围是什么?仅限当前连接/会话,还是会影响其他客户端? - Frozen Flame
如果没有修饰符,SET 命令会更改会话变量。如果该变量没有会话值,则会出现错误。 - arminrosu
3
这并没有回答提问者的问题,只是添加了一些有用的信息。这应该是一个评论,而不是一个答案。 - Sean the Bean
1
感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。一个适当的解释将极大地提高其长期价值,因为它展示了为什么这是一个好的问题解决方案,并使其对未来读者具有其他类似问题更有用。请[编辑]您的答案以添加一些解释,包括您所做的假设。 - Donald Duck

20
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

将会给你一个以逗号分隔的字符串。


12

好的答案。我也遇到了NULLS的问题,通过在GROUP_CONCAT内部包含COALESCE来解决它。示例如下:

SELECT id, GROUP_CONCAT(COALESCE(name,'') SEPARATOR ' ') 
FROM table 
GROUP BY id;

希望这能帮助其他人


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接