使用MySQL聚合函数来聚合数据,结果发现有刺客...

问题:

使用MySQL聚合函数 group_concat 的坑!


现象:

我有个业务,需要将表中符合条件的数据行的id聚合成一个字符串,以供另外一张表的查询过滤。

SELECT
	x 
FROM
	t_A
WHERE
	FIND_IN_SET(
		guan_lian,
		(
		SELECT
			group_concat( id_ ) as ids
		FROM
			t_C 
		WHERE
			parent_id_ = ( SELECT id_ FROM t_B WHERE shi_fou_ = '1' ORDER BY create_time_ DESC LIMIT 1 ) 
		) 
	)

在这里插入图片描述

当时在MySQL客户端查完SQL就这个图,然后也没拉宽去看,直接去看接口返回的数据情况…
SQL写完在测试环境执行时发现命中返回的数据只有一半,顿生疑惑,可能是正式数据没同步,查一下数据库对应数据是否一致,一查完了蛋,一致!结果只返回一半给我…
一细看,妈耶,一看就知道问题所在…
ids 数据只有一半,你猜我是怎么知道它返回一半的?
一个19位的id,它最后的一个id只返回了4位…
这明明被陷害了啊!有刺客!


原因

GROUP_CONCAT 函数默认有最大长度限制,如果数据量非常大,需要在 MySQL 配置中增加 group_concat_max_len 参数的值,避免截断合并后的结果😭


解决步骤:

1、计算业务数据大概长度
2、设置group_concat_max_len 参数值
3、测试

一、计算业务数据量大概长度

一个id是19位,大概数据量是200-300之间
得知长度范围大概在3800-5700之间,设置6000吧,妥善一点!

二、 设置group_concat_max_len 参数值

在全局范围内更改 group_concat_max_len 的值,并重启 MySQL 服务器使更改生效

SET GLOBAL group_concat_max_len = 6000; 

三、测试

经过一顿操作后ids成功返回准确的数据,终于可以开开心心准备回家钓鱼了🎣

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值