Mysql GROUP_CONCAT()函数

512 阅读2分钟

Mysql GROUP_CONCAT()函数

一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据。

group_concat()函数完整语法如下:

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

场景

现有学生表:

image.png

课程表:

image.png

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

结果:

image.png

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

结果:

image.png

注意事项:

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.系统默认的分隔符是逗号

参考:www.cnblogs.com/l20211103/p…