Mysql的函数GROUP_CONCAT和FIND_IN_SET

业务场景:
表A:存在 customer_phone;bac_id主键
表B:存在 主键id;bac_id字段

customer_phone:用户手机号;
bac_id:主键
表A :每个手机号可能会对应多个主键;要查询每个客户手机号包含哪些主键信息。

这样时候我们就可以用 GROUP_CONCAT

GROUP_CONCAT:获取分组字段包含的某个字段信息,返回的是逗号拼接的字符串,
同时也能对里面的字段进行排序。效果如下

在这里插入图片描述

业务场景二:
先根据场景一活得的结果;表A 要做到一个手机号对应一个主键的效果(该手机号对应的其余主键删除);同时更新表B的bac_id字段;(和表A保持同步)。

这个时候不能先删除表A重复的手机号;要先更新表B的信息

这个时候我们就可以利用FIND_IN_SET;
FIND_IN_SET(str,strlist) ;判断str是否存在strlist;存在则返回对应的记录;不存在返回空记录
拿手机号77778为例;包含43,74,603三个主键
那么我们就可以以上图的结果集和主键信息做关联,从而做更新处理

 update 表B  km
 inner join
( SELECT B.id ,B.bc_id,A.stbid,A.bac_id
 FROM

 (
  select customer_phone, count(1) ,GROUP_CONCAT(bac_id order by bac_id asc) stbid,min(bac_id) bac_id
  from 表A
  group by customer_phone  having(count(1)>1)
 ) A

JOIN   表B     B
ON FIND_IN_SET(B.bc_id,A.stbid) ) ks
on km.id=ks.id
set km.bc_id=ks.bac_id

删除同一个手机号多余的记录信息(保留创建时间最早的记录)

DELETE FROM   表A    WHERE bac_id NOT IN (
  SELECT t.min_id FROM (
    SELECT MIN(bac_id) AS min_id FROM   表A     GROUP BY customer_phone
  ) t
)

今天的分享就到此结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博客胡

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值