业务场景:
表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
)
今天的分享就到此结束了。