Mysql GROUP_CONCAT()函数
一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据。
group_concat()函数完整语法如下:
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
场景
现有学生表:
课程表:
1、查询每个学生每门课程的成绩,显示在一行,且对应多个字段
SELECT
r.*,
GROUP_CONCAT(case when s.type="语文" then s.type end) as course1,GROUP_CONCAT(case when s.type="语文" then s.data end) as data1,
GROUP_CONCAT(case when s.type="数学" then s.type end) as course2,GROUP_CONCAT(case when s.type="数学" then s.data end)as data2,
GROUP_CONCAT(case when s.type="英语" then s.type end) as course3,GROUP_CONCAT(case when s.type="英语" then s.data end)as data3
FROM
tb_student r
LEFT JOIN tb_course s ON r.id = s.sId
GROUP BY
r.id
结果:
2、查询每个学生的所有课程,以||分隔,并按成绩排序
SELECT
r.*,
GROUP_CONCAT(DISTINCT s.type ORDER BY s.data desc Separator '||') as course
FROM
tb_student r
LEFT JOIN tb_course s ON r.id = s.sId
GROUP BY
r.id
结果:
注意事项:
1.GROUP_CONCAT长度限制
用了GROUP_CONCAT后,SELECT里如果使用了LIMIT是不起作用的.
用GROUP_CONCAT连接字段的时候是有长度限制的,并不是有多少连多少。但可以设置下
使用group_concat_max_len系统变量,可以设置允许的最大长度。
语法如下,其中 val 是一个无符号整数:
SET [SESSION | GLOBAL] group_concat_max_len = val;
若已经设置了最大长度, 则结果被截至这个最大长度。
查看服务器中设置
mysql> show variables like '%group_concat%'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | group_concat_max_len | 1024 | +----------------------+-------+ 1 row in set (0.00 sec) 以上设置的值说明当前是默认长度1KB
2.改变参数值
方法一:修改配置文件中参数,新增 group_concat_max_len = 10240
方法二:在会话中实现,全局或当前session中
SET GLOBAL group_concat_max_len=10240;
SET SESSION group_concat_max_len=10240;
总结
1.用了group_concat后,select 里如果使用了 limit 是不起作用的
2.用group_concat连接字段的时候是有长度限制的,并不是有多少连多少。但你可以设置一下
3.使用group_concat_max_len系统变量,你可以设置允许的最大长度
4.系统默认的分隔符是逗号