赞
踩
业务场景=>
人员信息,需要包含合同信息;
人员合同信息:
问题点?
同一个人员,相同时间内有多个不同的合同入库
意味着我们对应需要取相关的人员信息时,需要对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的相关性能!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。