如何在MySQL中查找重复项

2 投票
4 回答
1240 浏览
提问于 2025-04-15 15:06

假设我有很多列。如果有两列的内容完全相同,那它们就是重复的。

ID | title | link | size | author

再假设如果有两行或更多行的链接和大小相似,那这些行也是重复的。我要怎么把这些重复的行放到一个列表里,然后处理它们呢?

4 个回答

1

在你从MySQL表中删除了重复的数据后,可以给这个表添加一个唯一索引,这样就不会再插入重复的数据了:

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

假设 idlinksize 这三个字段都不能是空的,并且 id 字段是主键。这段话的意思是,它会给你找出重复行的 id。需要注意的是,如果有三行或更多行的 linksize 值完全相同,那么同一个 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   
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

我喜欢使用子查询,因为这样我可以选择所有记录,除了第一条或最后一条。这样很容易就能转成删除的查询。

举个例子:选择所有重复的记录,除了那个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

撰写回答