如何在MySQL中查找重复项
假设我有很多列。如果有两列的内容完全相同,那它们就是重复的。
ID | title | link | size | author
再假设如果有两行或更多行的链接和大小相似,那这些行也是重复的。我要怎么把这些重复的行放到一个列表里,然后处理它们呢?
4 个回答
1
在你从MySQL表中删除了重复的数据后,可以给这个表添加一个唯一索引,这样就不会再插入重复的数据了:
create unique index theTable_index on theTable (link,size);
1
假设 id、link 和 size 这三个字段都不能是空的,并且 id 字段是主键。这段话的意思是,它会给你找出重复行的 id。需要注意的是,如果有三行或更多行的 link 和 size 值完全相同,那么同一个 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