使用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
    评论
MySQL聚合函数是一组用于计算行数据的函数,它们返回单个值作为结果。常见的聚合函数包括SUM、AVG、COUNT、MAX和MIN。下面是一些高级使用聚合函数的技巧: 1. 使用DISTINCT关键字 在聚合函数使用DISTINCT关键字可以消除重复值。例如,如果您想计算不同城市中有多少个客户,可以这样写: ``` SELECT COUNT(DISTINCT city) FROM customers; ``` 2. 使用GROUP BY子句 GROUP BY子句将行分组为多个集合,并对每个组应用聚合函数。例如,如果您想找出每个城市的平均客户数,可以这样写: ``` SELECT city, AVG(customers) FROM sales GROUP BY city; ``` 3. 使用HAVING子句 HAVING子句与WHERE子句类似,但它用于过滤GROUP BY子句生成的结果集。例如,如果您想找出平均客户数大于10的城市,可以这样写: ``` SELECT city, AVG(customers) FROM sales GROUP BY city HAVING AVG(customers) > 10; ``` 4. 使用ORDER BY子句 ORDER BY子句用于按升序或降序对结果集进行排序。例如,如果您想按平均客户数降序排列城市,可以这样写: ``` SELECT city, AVG(customers) FROM sales GROUP BY city ORDER BY AVG(customers) DESC; ``` 5. 使用聚合函数嵌套 聚合函数可以嵌套在其他聚合函数中。例如,如果您想找出每个城市的最大客户数,可以这样写: ``` SELECT city, MAX(customers) FROM (SELECT city, COUNT(*) AS customers FROM sales GROUP BY city) AS subquery GROUP BY city; ``` 以上是一些高级使用聚合函数的技巧,它们可以帮助您更好地处理和分析数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值