踩坑系列——mysql查询使用group_concat()结果被截断问题

背景:
项目中有一个统计报表,结果需要展示成这种,并按分类分页查询:
在这里插入图片描述
表中可能多条数据对应相同的分类,但是反馈状态不一样,一开始的实现思路是这样的:

(1)查询表然后按分类进行group分组,并将其中一个字段使用group_concat()拼接。sql及查询结果如下:

 select first_category_name,second_category_name,GROUP_CONCAT(sku_no) as sku_no_list
 from table
 where 1=1 and status in (2,3)
 group by first_category_name,second_category_name

在这里插入图片描述
这样就得到每个分类都有哪些对应的数据,然后将sku_no_list按逗号拆分,查询每个sku_no对应记录的状态,做统计。

问题:
测试环境验证核对数据正确,但是上线后,正式环境统计的各分类总数,有些是不正确,偏少,有些是正确的。一开始以为是group查询分类之后的处理代码有问题,但是想到测试环境是正确的,又有点不服气。

排查:
(1)以“隐形眼镜”这个分类为准,执行上面的group统计,将sku_no_list贴到word里面,将,替换成换行,再贴到excel里面,
(2)单独查询second_category_name=隐形眼镜的sku_no,将sku_no也贴到excel中
(3)比较excel中两列数据,发现使用group统计出来的比单独查询的要少了一部分

于是比较好奇,group_concat()的结果为什么会变少?难道有长度限制,被截取了?

查资料,果然是这样!!
mysql的group_concat默认连接长度为1024字符,也就是说你连接后的结果超过1024字符,它只会显示这么长,其余部分都会被截取丢掉。

解决方案:
(1)执行以下sql语句:
SET GLOBAL group_concat_max_len = 102400; //其中数字大小可修改

(2)在MySQL配置文件(my.ini)中加: group_concat_max_len = -1 # -1为最大值或填入你要的最大长度,并重启mysql

但是第一个方法有一个缺点,重启服务后设置失效,而第二个方法还需要走流程找DBA去修改线上数据库配置,太麻烦了。于是只能采取别的方法,迂回实现。

(3)程序处理

更改分组查询,去掉group_concat:

select first_category_name,second_category_name
from table
where 1=1 and status in (2,3)
group by first_category_name,second_category_name

然后循环分组结果,再将类目名称作为条件查询数据,对查询出的数据进行统计。线上验证数据正确。

总的来说还是知识不到位,数据量少的时候没测出来,踩坑了。。。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值