假设我有很多列。如果2列匹配且完全相同,则它们是重复的。
ID | title | link | size | author
假设链接和大小对于2行或更多行是相似的,那么这些行是重复的。 如何将这些重复项放入列表并进行处理?
答案 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
中专门执行此操作,则需要表格的某种自联接(link
和size
的相等),并且可以伴随不同的阐述。既然你也提到了Python,我假设你想用Python进行处理;在这种情况下,最简单的是在'SELECT * FROM thetable ORDER BY链接上构建一个迭代器,对于这两个字段,大小为, and process with
itertools.groupby using, as key, the
operator.itemgetter`;这将为每个1+行的自然分组提供相同字段的相同值。
如果你澄清你想要处理的地方,我可以详细说明这两个选项,并理想地提供你想要执行的处理类型的例子!