最近在业务系统中出现了bug,一部分用户的某种数据出现了多条重复,为了洗掉重复的数据,只保留第一次出现的数据,就有了标题中的需求。
假设现在系统中表test_copy1结构及数据如图所示:
那么要删除的就是id=999 id=1012、1013、1014和id=1015的数据
首先要选出要删除的记录,需要用到聚合函数和HAVING字句
SELECT id FROM test_copy1 WHERE id NOT IN ( SELECT min( id ) AS id FROM test_copy1 GROUP BY `name` HAVING min( id ) );
接下来就是删除这些数据,如果直接写如下的SQL会报出异常1093-You can’t specify target table for update in FROM clause
参考文章:http://blog.csdn.net/chenhao0568/article/details/60133094
最终SQL如下:
DELETE
FROM
test_copy1
WHERE id IN ( SELECT
id
FROM ((SELECT * FROM test_copy1) temp)
WHERE id NOT IN (
SELECT min( id ) AS id
FROM ((SELECT * FROM test_copy1) temp1)
GROUP BY `name`
HAVING min( id )));