如何使用GROUP BY连接MySQL中的字符串?


351

基本上,问题是如何从中获得:

foo_id foo_name
1个
1个
2℃

对此:

foo_id foo_name
1 AB
2℃

13
DOWNVOTE命名列字符串确实很容易混淆,它给它一个看起来像数据类型的名称。因此,任何答案也都会受到影响,因为答案看起来像是在指定列名称时指定数据类型一样
-barlop

2
@barlop通过编辑问题和答案来解决此问题。
ustun

Answers:



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

更多细节在这里

在上面的链接中GROUP_CONCAT:该函数返回一个字符串结果,其中包含来自组的串联的非NULL值。如果没有非NULL值,则返回NULL。


结果列的字符数有限制。看到这里和文档:)
marlo

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

将给您一个逗号分隔的字符串


17
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;

15

结果被截断为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

结果被截断为由group_concat_max_len系统变量指定的最大长度,该默认值默认值为1024个字符。docs
marlo

group_concat_max_len配置的范围是什么?当前的连接/会话,还是会影响其他客户端?
冰冻的火焰

@FrozenFlame:>如果不存在修饰符,则SET更改会话变量。如果变量没有会话值,则会发生错误。从dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
arminrosu

3
这不会回答OP的问题,而只会添加有用的信息。这应该是评论,而不是答案。
肖恩·比恩

1
感谢您提供此代码段,它可能会提供一些有限的即时帮助。通过说明为什么这是一个很好的解决方案的方法,正确的解释将大大提高其长期价值,并使之对于其他存在类似问题的读者来说更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
唐老鸭

11

好答案。我也遇到了NULLS的问题,并设法通过在GROUP_CONCAT内包含一个COALESCE来解决了这个问题。示例如下:

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

希望这对别人有帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.