问题:
使用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
成功返回准确的数据,终于可以开开心心准备回家钓鱼了🎣