当前位置:   article > 正文

mysql 分组查询(分组后取对应数据行)_mysql 分组后获取组内所有主键

mysql 分组后获取组内所有主键

业务场景=>

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

人员合同信息:

问题点?

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

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

此时该如何实现呢?

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

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

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

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

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

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

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

解决方案:

  1. #方法一:在MySQL的配置文件中加入如下配置(推荐):
  2. group_concat_max_len = 102400
  3. #方法二:更简单的操作方法,执行SQL语句:
  4. SET GLOBAL group_concat_max_len = 102400;-- 修改本地全局配置
  5. SET SESSION group_concat_max_len = 102400;-- 修改当前事务或临时操作的临时配置
  6. -- 共同点重启mysql后 会失效

通过场景分析

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/952721
推荐阅读
相关标签
  

闽ICP备14008679号