在数据库管理中,处理重复数据是一项常见的任务。本文将详细介绍如何在 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不在合并结果中的记录,从而保留每组中的两条记录。