Mysql筛选重复数据

有个需求:选出表里重复的数据,只保留一个

需要处理的数据

having是在分组之后,对组内数据进行筛选,where 就不多说了,在分组前添加条件的

SELECT id,name,count(name) FROM idiom group by name HAVING count(name)>=2 可以看出大概519个数据都是有重复的

查找重复的有多少

SELECT id,name,min(id),max(id),count(name) FROM idiom group by name HAVING count(name)>=3 可以看出默认选出的id就是最小的

id排序

重复两条的数据有点多,直接上3个跟上头有个对比 SELECT id,name FROM idiom WHERE name IN (SELECT name FROM idiom GROUP BY name HAVING COUNT(name)>=3) AND id NOT IN (SELECT id FROM idiom GROUP BY name HAVING COUNT(name)>=3)

删除之前的查看要出的内容

一切正常,执行删除:DELETE FROM idiom WHERE name IN (SELECT name FROM idiom GROUP BY name HAVING COUNT(name)>=2) AND id NOT IN (SELECT id FROM idiom GROUP BY name HAVING COUNT(name)>=2)

但是,好像报错啦:

emmmmm报错

没办法,这个报错查了好多好像是要使用临时表于是改成这个样子

1
2
3
4
5
6
7
8
DELETE FROM idiom WHERE id IN (
    SELECT x.id FROM
    	(SELECT id,name FROM idiom WHERE name IN (
            SELECT name FROM idiom GROUP BY name HAVING COUNT(name)>=2
        )AND id NOT IN (
             SELECT id FROM idiom GROUP BY name HAVING COUNT(name)>=2)
        ) x
)

删除成功,不要在意idiom_backup_1这个名字