MySQL 处理重复数据:保留一条与两条的实现方案
在数据库管理中,处理重复数据是一项常见的任务。本文将详细介绍如何在 MySQL 数据库里,针对 test
表中 fd
和 fe
字段存在的重复数据进行处理,分别实现保留一条和两条数据的操作。
表结构与需求概述
假设 test
表包含三个字段:id
(作为主键)、fd
和 fe
。其中,fd
和 fe
字段存在重复值,我们的目标是分别保留每组重复数据中的一条和两条记录,同时删除其余的重复数据。
保留每组重复数据中的一条记录
思路
我们可以使用子查询结合 MIN(id)
函数,按 fd
和 fe
字段分组,找出每组中 id
最小的记录,然后删除 id
不在这些最小 id
范围内的记录。
SQL 代码
DELETE
FROM
test
WHERE
id NOT IN (
SELECT
id
FROM
( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 1 ORDER BY id ) a
);
代码解释
- 子查询:
SELECT min( id ) id FROM test GROUP BY fd, fe HAVING count( id ) > 1
按fd
和fe
分组,找出每组中id
最小的记录,并且只考虑重复记录数大于 1 的组。 - 外层查询:
DELETE FROM test WHERE id NOT IN (...)
删除id
不在子查询结果中的记录,从而保留每组中的一条记录。
保留每组重复数据中的两条记录
思路
为了保留每组中的两条记录,我们可以分别找出每组中 id
最小和最大的记录,然后使用 UNION
操作符将它们合并,最后删除 id
不在合并结果中的记录。
SQL 代码
DELETE
FROM
test
WHERE
id NOT IN (
SELECT
id
FROM
( SELECT
id
FROM
test
WHERE
id IN (
SELECT
id
FROM
( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) a
UNION
SELECT
id
FROM
( SELECT max( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) b
)) c
);
代码解释
- 子查询
a
:SELECT min( id ) id FROM test GROUP BY fd, fe HAVING count( id ) > 2
找出每组中id
最小的记录,只考虑重复记录数大于 2 的组。 - 子查询
b
:SELECT max( id ) id FROM test GROUP BY fd, fe HAVING count( id ) > 2
找出每组中id
最大的记录,同样只考虑重复记录数大于 2 的组。 UNION
操作:将子查询a
和b
的结果合并,得到每组中id
最小和最大的记录。- 外层查询:
DELETE FROM test WHERE id NOT IN (...)
删除id
不在合并结果中的记录,从而保留每组中的两条记录。