如何在MySQL中找到重复项

时间:2009-10-15 18:02:15

标签: python mysql

假设我有很多列。如果2列匹配且完全相同,则它们是重复的。

ID | title | link | size | author

假设链接和大小对于2行或更多行是相似的,那么这些行是重复的。 如何将这些重复项放入列表并进行处理?

4 个答案:

答案 0 :(得分:7)

将返回所有有重复记录的记录:

SELECT theTable.*
FROM theTable
INNER JOIN (
  SELECT link, size
  FROM theTable 
  GROUP BY link, size
  HAVING count(ID) > 1
) dups ON theTable.link = dups.link AND theTable.size = dups.size

我喜欢子查询b / c我可以做一些事情,比如选择除了第一个或最后一个。 (很容易变成删除查询)。

示例:选择所有重复记录,除了具有最大ID的那个:

SELECT theTable.*
FROM theTable
INNER JOIN (
  SELECT link, size, max(ID) as maxID
  FROM theTable 
  GROUP BY link, size
  HAVING count(ID) > 1
) dups ON theTable.link = dups.link 
          AND theTable.size = dups.size 
          AND theTable.ID <> dups.maxID

答案 1 :(得分:1)

假设 id link size 都不是NULL,而 id 字段是主要的键。这为您提供了重复行的ID。请注意,如果有三行或更多行具有相同的链接和大小值,则可以在结果中多次使用相同的ID。

select a.id, b.id 
from tbl a, tbl b  
where a.id < b.id   
  and a.link = b.link  
  and a.size = b.size   

答案 2 :(得分:1)

从MySQL表中删除重复项后,您可以添加唯一索引 到表中所以不能再插入重复项:

create unique index theTable_index on theTable (link,size);

答案 3 :(得分:0)

如果您想在SQL中专门执行此操作,则需要表格的某种自联接(linksize的相等),并且可以伴随不同的阐述。既然你也提到了Python,我假设你想用Python进行处理;在这种情况下,最简单的是在'SELECT * FROM thetable ORDER BY链接上构建一个迭代器,对于这两个字段,大小为, and process with itertools.groupby using, as key, the operator.itemgetter`;这将为每个1+行的自然分组提供相同字段的相同值。

如果你澄清你想要处理的地方,我可以详细说明这两个选项,并理想地提供你想要执行的处理类型的例子!