简单分析
- 一说起删除重复记录,可以想到用delete + select + groupby组合
- 保留唯一重复记录,需要结合实际场景保留符合要求的数据
- 注意点:delete 不能直接delete from table where id in(select * from tab1),不能直接把select得到的结果作为delete的条件,所以需要建立临时表来操作;
解决方案
方案一:
用select筛选出需要删除的ids、或筛选出不需要删除的ids,两种都可,只不过一种是选中,一种是反选;话不多少,直接贴我第一版sql:
DELETE from person_email WHERE id NOT in (
SELECT temp.id FROM (
SELECT min(id) as id from person_email GROUP BY email HAVING count(1) > 1
UNION ALL
SELECT id as id from person_email GROUP BY email HAVING count(1) = 1
) temp
);
【注:1.通过group by email,筛选出出现一次,以及重复出现的最小的id;2.把select筛选出的结果放入临时表;3.通过反选的方式,把不在这个id范围的重复数据都删掉,保留的都是符合条件的数据了】
【优化】