在做数据初始化的时候, 由于需要修改满足条件的全部订单的状态, 因此, 想使用 group_concat 函数提取满足条件的所有订单 id, 以方便写回滚脚本. 测试数据取自表 test1, 表结构和相关 insert 脚本见《常用 SQL 之日期格式化和查询重复数据》.
使用方法
select t.`name`,group_concat(t.id) AS result from test1 t group by t.`name`;
执行后, 结果集如下图所示:
查询结果 result 默认使用英文逗号连接, 可以使用 separator 关键字指定连接符:
select t.`name`,group_concat(t.id separator ';') AS result from test1 t group by t.`name`;
执行后, 结果集如下图所示:
使用关键字 order by 可以指定被合并数据的排序,
select t.`name`,group_concat(t.id order by t.id desc) AS result from test1 t group by t.`name`;
执行后, 结果集如下图所示:
温馨提示, 关键字 separator 和 order by 不可以同时使用.
踩过的坑
在应用过程中, 发现 group_concat 会漏掉部分数据, 究其原因是因为这个函数有默认长度限制, 默认是 1024. 可以通过如下脚本查询数据库的当前限制
show variables like 'group_concat_max_len';
在客户端设置当前 session 的 group_concat 长度, 其它 session 连接不受影响
SET SESSION group_concat_max_len = 10240;
设置全局 group_concat 长度
SET GLOBAL group_concat_max_len = 10240;
该语句在执行后, MySQL 重启前一直有作用, 但一旦重启 MySQL, 则会恢复默认的设置值.
来源: http://www.bubuko.com/infodetail-3213046.html