如何根据SQL中的更多列删除重复的行?

时间:2015-07-18 16:30:19

标签: mysql sql duplicates

我有一个包含电影及其链接的数据库。 一部电影可能有更多的链接。 不幸的是,他们中的一些人有两次相同的链接。

例如:

row1 Alien vs. Predator http://www.avplink1
row2 Alien vs. Predator http://www.avplink1
row3 Alien vs. Predator http://www.avplink2
row4 Alien vs. Predator http://www.avplink3
row5 Minions http://www.minionslink1
row6 Minions http://www.minionslink1

我想删除表中多个行,但保留其中一行。 所以我想这样:

row1 Alien vs. Predator http://www.avplink1
row3 Alien vs. Predator http://www.avplink2
row4 Alien vs. Predator http://www.avplink3
row5 Minions http://www.minionslink1

如何编写删除这些行的SQL查询? 谢谢!

编辑:

我用这段代码解决了:

DELETE a            
FROM links a            
JOIN (SELECT MIN(id) id, movielink
FROM links 
GROUP BY movielink) b ON a.movielink= b.movielink 
AND a.id <> b.id 

谢谢大家的帮助!

2 个答案:

答案 0 :(得分:1)

除了

之外,这几乎与this question重复
delete from

而不是

select * from

答案 1 :(得分:1)

这是每行中没有唯一ID的痛苦(所有表都应该有一个主键)。可能最简单的方法是在这种情况下使用临时表:

delete t
    from t join
         (select movie, link, min(rowid) as minrowid
          from t
          group by movie, link
         ) tt
         on t.movie = tt.movie and t.link = tt.link and t.rowid <> tt.minrowid

如果您拥有唯一ID,则有更简单的方法。执行此操作后,在表上放置一个唯一索引以防止将来发生这种情况:

[Mr.|Ol’] Slome[{r|Dog|Dawg}] 

实际上,我认为此声明也会删除重复的行,但我不建议使用索引创建来删除行。

编辑:

如果您有唯一的行标识符,那么您可以这样做:

[]