mysql 分组查询(分组后取对应数据行)

业务场景=>

人员信息,需要包含合同信息;

人员合同信息:

问题点?

同一个人员,相同时间内有多个不同的合同入库

意味着我们对应需要取相关的人员信息时,需要对user_code进行分组,需要获取第一条数据,

此时该如何实现呢?

通常方式是groupby分组后根据最大的时间再去进行一次连表查询

但是这种方式的弊端是:查询效率增加,分组条件如果多个字段全部相同,无法辨别分组取值

但是通过GROUP_CONCAT 和,SUBSTRING_INDEX 的组合查询就能让查询效率提升的同时,快速查找分组目标

 SELECT user_code
,SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY lastModifiedDateTime DESC, ',' ),',',1) as keyId	 FROM base_contract WHERE is_deleted =0  AND user_code='NRCB16630'
GROUP BY  user_code

重点之处是:以group by user_code 分组后 通过 group_concat 进行指定字段的排序拼接,然后通过SUBSTRING_INDEX 来查找指定下标的数据,这样就实现了快速的定位分组数据

PS:在使用过程中的问题》》》》》》》

在使用SUBSTRING_INDEX进行组合group_concat 数据拼接成字符串时就会存在拼接长度的问题,如果每次分组的数据id超过mysql 默认的拼接最大长度为1024 个字节,由于1024个字节会出现不够用的情况,就会出现问题导致select 能够成功进行,但是一旦涉及数据操作就会被mysql 阻断操作:

解决方案:



#方法一:在MySQL的配置文件中加入如下配置(推荐):
group_concat_max_len = 102400

#方法二:更简单的操作方法,执行SQL语句:
SET GLOBAL group_concat_max_len = 102400;-- 修改本地全局配置
SET SESSION group_concat_max_len = 102400;-- 修改当前事务或临时操作的临时配置
-- 共同点重启mysql后  会失效

通过场景分析

如果对于你来说,不在乎是否重启,或者影响用户当前的数据库性能,推荐第一种方案;

 如果只是临时使用推荐第二种方案,也可以在使用完成后,重新赋值为-1 ,保证不影响mysql的相关性能!


版权声明:本文为weixin_40715949原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。