如何删除 MySQL 中的重复记录,同时保留最新
在处理包含唯一标识符和重复电子邮件地址的表时,这是通常需要删除这些重复项,同时保留最新的记录。 MySQL 提供了多种方法来实现此目标。
一种方法涉及识别重复的电子邮件地址并查找每封电子邮件的最新记录(由最大 ID 表示)。这可以使用 GROUP BY、HAVING 和 MAX() 函数的组合来完成。
识别出最新记录后,下一步就是删除 ID 低于其 ID 的所有重复记录。各自的最大ID。这可以通过使用 INNER JOIN 比较电子邮件地址和 ID 值的 DELETE 语句来完成。
示例数据库表
为了说明此过程,请考虑下表名为“test”:
ID EMAIL ---------------------- -------------------- 1 aaa 2 bbb 3 ccc 4 bbb 5 ddd 6 eee 7 aaa 8 aaa 9 eee
识别重复项电子邮件
select email from test group by email having count(*) > 1;
此查询返回以下结果,表明 'aaa'、'bbb' 和 'eee' 是重复的电子邮件:
EMAIL -------------------- aaa bbb eee
查找最近的记录
select max(id) as lastId, email from test where email in ( select email from test group by email having count(*) > 1 ) group by email;
此查询检索每个重复项的最大 ID 和相应的电子邮件地址:
LASTID EMAIL ---------------------- -------------------- 8 aaa 4 bbb 9 eee
删除重复记录
delete test from test inner join ( select max(id) as lastId, email from test where email in ( select email from test group by email having count(*) > 1 ) group by email ) duplic on duplic.email = test.email where test.id < duplic.lastId;
执行此查询后,“test”表将包含仅每个电子邮件地址的最新记录,结果如下data:
+----+-------+ | id | email | +----+-------+ | 3 | ccc | | 4 | bbb | | 5 | ddd | | 8 | aaa | | 9 | eee | +----+-------+
优化的删除查询
下面提供了另一种更优化的删除查询:
delete from test where id not in ( select max(id) from test group by email)
以上是如何删除MySQL中的重复记录同时保留最新记录?的详细内容。更多信息请关注PHP中文网其他相关文章!