概述
今天产品让我导出一批数据,大概是四五张表的一个联查,但是其中有一个字段的需要多个字段拼接起来,大概就是这样:
a 1
a 2
a 3
b 4
b 5
最后需要展示成这样:
a 1,2,3
b 4,5
可以使用mysql聚合函数中的group_concat
函数:
group_concat
作用:将属于同一组的非空列拼接起来,并且返回。比如上面使用分组查询的话,1、2、3就属于a这一组,4、5就属于b这一组。
语法:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
举例:
以t_user
和t_course
两张表举例:
mysql> select * from t_user;
+---------+-----------+-----+
| user_no | user_name | age |
+---------+-----------+-----+
| 123456 | 张三 | 18 |
| 456789 | 李四 | 20 |
+---------+-----------+-----+
2 rows in set (0.00 sec)
mysql> select * from t_course;
+---------+-----------+-------------+
| user_no | course_no | course_name |
+---------+-----------+-------------+
| 123456 | 1 | 数学 |
| 123456 | 2 | 英语 |
| 123456 | 3 | 语文 |
| 456789 | 1 | 数学 |
+---------+-----------+-------------+
4 rows in set (0.00 sec)
使用group_concat
函数就可以完成把属于同一组的非空列以指定分隔符连接在一起:
mysql> SELECT
-> t1.user_no,
-> GROUP_CONCAT( t2.course_name SEPARATOR '; ') as courses
-> FROM
-> t_user t1
-> LEFT JOIN t_course t2 ON t1.user_no = t2.user_no
-> GROUP BY
-> t1.user_no;
+---------+------------------------+
| user_no | courses |
+---------+------------------------+
| 123456 | 数学; 语文; 英语 |
| 456789 | 数学 |
+---------+------------------------+
2 rows in set (0.00 sec)
-
组中值之间的默认分隔符是逗号
,
。要显式指定分隔符,请使用SEPARATOR
后跟应插入组值之间的字符串文字值。要完全消除分隔符,请指定SEPARATOR ''
。 -
最大长度
group_concat_max_len
,默认值为 1024。该值可以设置得更高,但返回值的有效最大长度受max_allowed_packet
值的限制 。在运行时更改 的值的语法group_concat_max_len
如下,其中*val
* 是无符号整数:SET [GLOBAL | SESSION] group_concat_max_len = val;