本文正在参加「技术专题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;
查询结果如下:
| className | students |
|---|---|
| 三年级一班 | 张三, 李四, 王五, 刘琦 |
| 三年级二班 | 张三, 李四, 王五, 刘琦 |
使用方式大概就是这样,在使用group_concat()函数容易遇到的一些其它问题如下:
GROUP_CONCAT函数返回单个字符串,而不是值列表。 这意味着您不能在IN操作符中使用GROUP_CONCAT函数的结果,例如在子查询中使用。
例如,GROUP_CONCAT函数返回值的结果:1, 2和3连接成为字符串: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子句在此语句中不起作用。