【问题标题】:Find and delete latter duplicate records查找并删除后面的重复记录
【发布时间】:2017-03-27 17:54:09
【问题描述】:

我有一张大约有 0.5 到 100 万条记录的表。该表有一个 varchar 字段的重复记录。

类似

ID int(11)
TITLE varchar(100)

有许多记录具有重复的 TITLE 值。

我需要删除重复记录。第一步是找到它们。我想有两种方法:

  1. 使用GROUP BY TITLE HAVING COUNT(*) > 1

  2. 使用SELECT ID, TITLE FROM MY_TABLE逐条记录,然后为每条记录使用SELECT ID FROM MY_TABLE WHERE TITLE='".$row['TITLE']." AND ID <> '".$row['ID']."'

问题是哪种方法有效?

或者还有其他更有效的方法吗?

我使用 php 作为基础语言。

【问题讨论】:

  • 你要删除哪一个?后者还是前者?
  • 以后就好了

标签: php mysql sql duplicates


【解决方案1】:

要删除所有重复记录(具有相同标题),您可以使用此查询:

DELETE B
FROM your_table A 
INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.

此查询将删除所有后面的重复记录,同时保留第一个。


为了在删除所有以前的重复记录时保持最新:

DELETE A
FROM your_table A 
INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.

编辑:

如果您想在执行删除操作之前查看后面哪些(重复)记录将被删除,请运行以下查询:

SELECT B.*
FROM your_table A 
INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID.

这假定所有新 ID 都将大于以前的 ID。一种 相当安全的假设,但需要谨慎

感谢 @xQbert 的添加。

【讨论】:

  • 有没有办法在我运行实际删除之前查看哪些记录将被删除...可能是 SELECT B.* ... 会这样做吗?...
  • 请在edit部分查看更新后的答案。
  • 我认为这是一个有用的答案,我会试一试然后接受...谢谢
  • 这假定所有新 ID 都将大于以前的 ID。一个相当安全的假设,但需要谨慎。
  • 这很好用......而且新的 ID 比以前的要大,所以它工作......感谢@xQbert 的提示
【解决方案2】:

使用下面的sql

DELETE FROM MY_TABLE WHERE ID NOT IN (SELECT MIN(x.ID) FROM MY_TABLE x GROUP BY x.TITLE);

【讨论】:

  • 我理解最里面的查询,它给出了所有不应该被删除的 id,无论它们是否重复......但我不明白 2 件事......第一个就是为什么使用另一个SELECT * FROM (...) y...?第二是为什么要使用 x。在最里面的查询中...?
  • 当我将此查询用于 30M 记录时出现了一些错误。如果您没有收到 1093 错误,则可以跳过此部分。而且,如果您想使用此查询查看将要删除的记录,只需在同一查询中将 DELETE 替换为 SELECT 并运行查询即可。
猜你喜欢
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
相关资源
最近更新 更多