记录一下MySQL使用GROUP_CONCAT函数时遇到的问题

583 阅读2分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动

在MYSQL中,使用GROUP_CONCAT()拼接函数时,遇到了这样一个问题,拼接后的字符串不全,少了很大一部分数据,经过查找资料,发现group_concat()函数默认最大拼接长度为1024,如果文本过长,则会被截取,这时,需要手动修改mysql配置,设置最大拼接长度。

设置方法如下

-- 在mysql中执行如下语句
SET GLOBAL group_concat_max_len = 4096 -- 4096为设置的拼接长度
SET SESSION group_concat_max_len = 4096

下面再来介绍一下group_concat()函数的使用方式

group_concat()函数功能为将查询语句中,group by产生的同一个分组中的数据值拼接起来,返回一个拼接后的字符串结果。 group_concat()函数首先根据group by将所指定的列去进行分组操作;然后将同一组的列值拼接后再展示出来,在展示的数据中,使用分隔符将每个数据进行分割,默认分隔符为“,”;由函数参数也就是字段名决定要返回的列,如下所示:

select class_name as className, group_concat(student_name) as students from student group by class_name;

查询结果如下:

classNamestudents
三年级一班张三, 李四, 王五, 刘琦
三年级二班张三, 李四, 王五, 刘琦

使用方式大概就是这样,在使用group_concat()函数容易遇到的一些其它问题如下:

GROUP_CONCAT函数返回单个字符串,而不是值列表。 这意味着您不能在IN操作符中使用GROUP_CONCAT函数的结果,例如在子查询中使用。

例如,GROUP_CONCAT函数返回值的结果:1, 23连接成为字符串:1,2,3

如果将此结果提供给IN运算符,则查询不能正常工作。因此,查询可能不返回任何结果。例如,以下查询将无法正常工作。

因为IN运算符接受诸如(1,2,3)的值的列表,而不是由值列表('1,2,3')组成的字符串。 因此,以下查询将无法正常工作。

SELECT 
    id, name
FROM
    table_name
WHERE
    id IN GROUP_CONCAT(id);

SQL

因为GROUP_CONCAT函数是一个聚合函数,要对值进行排序,必须在函数内使用ORDER BY子句,而不是SELECT语句中的ORDER BY

以下示例演示了在使用GROUP_CONCAT函数的上下文中ORDER BY子句的不正确使用:

SELECT 
    GROUP_CONCAT(DISTINCT class_name
        SEPARATOR ';')
FROM
    student
ORDER BY class_name;

SQL

SELECT子句返回一个字符串值,因此ORDER BY子句在此语句中不起作用。