2016-11-14 58 views
1

我有一张表,有大约0.5到1百万条记录。该表通过varchar字段具有重复的记录。查找并删除后面的重复记录

喜欢的东西

ID int(11) 
TITLE varchar(100) 

有迹象表明,有重复的TITLE值多条记录。

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

  1. 要使用SELECT ID, TITLE FROM MY_TABLE使用由记录GROUP BY TITLE HAVING COUNT(*) > 1

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

的问题是,哪种方法有效?

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

我使用PHP作为基础语言。

+0

你想要删除哪一个?后者还是前者? – 1000111

+0

以后会好的 –

回答

6

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

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的更大。 A 非常安全的假设,但谨慎保证

感谢@xQbert为此增加。

+0

有没有办法看到哪些记录将被删除之前,我运行实际删除...可能是SELECT B. * ...将做到这一点?... –

+1

请检查** edit **部分下更新的答案。 – 1000111

+0

我认为这是一个有用的答案,我会试一试,然后接受...谢谢 –

0

使用下面的SQL

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

我理解最内部的查询,它给出了所有不应该被删除的ID,无论它们是重复的还是不重复的......但我不明白2件事......第一是为什么使用另一个'SELECT * FROM(...)y' ...?第二是为什么使用x。在最内层查询...? –

+0

或者换句话说,u能解释这个查询它是如何工作... –

+0

有一些错误,当我使用此查询到30M的记录。如果你没有收到1093错误,你可以跳过这部分。 而且,如果你想查看其打算使用此查询来删除记录,只需用'SELECT'in相同的查询和运行查询替换'DELETE'。 – Naga