2016-07-29 53 views
1

我想删除除id在所有列相同的值的所有行,除了与最低id行。
鉴于这种数据:删除重复的行,只保留最低的ID

id year file name language download 
1 2014 a x  h  d 
2 2014 a c  i  d 
3 2014 a x  h  d 
4 2014 a x  h  d 
5 2015 b y  j  d 
6 2015 b y  j  d 
7 2015 b y  j  d 

在这里,我想删除3和4(1离开 - 最低ID),和删除6,7(留下5)。

“匹配”是指两行具有相同的“年”,“文件”,“姓名”,“语言”和“下载”。

可能有超过10个重复的行。我想删除所有行,但保留最低的id行。

+0

至少1行??? – Strawberry

+0

是的。保持最低的最低ID行 – Jaki

+0

它不会工作... – Jaki

回答

1

使用MySQL的多表删除的语法与自联接:

delete b 
from mytable a, mytable b 
where b.year = a.year 
and b.file = a.file 
and b.name = a.name 
and b.language = a.language 
and b.download = a.download 
and b.id > a.id -- this condition picks the higher id(s) for deletion 

这应该执行得很好,因为它本质上是一个单一的加盟。

+0

是的,它为我工作。谢谢 – Jaki

+0

我运行命令,但它需要很多时间。我有一个超过两百万行的大型数据库。 – Jaki

+0

@jaki将索引放在哪个非id列具有最多不同值的位置。如果不同值的数量小于大约100,则将索引设置为2列,并将第二列作为不同值的次数最多的非ID列。 – Bohemian

1
DELETE 
    FROM myTable a 
WHERE EXISTS (SELECT b.id 
       FROM myTable b 
       WHERE a.year = b.year 
       AND a.file = b.file 
       AND a.name = b.name 
       AND a.language = b.language 
       AND a.download = b.download 
       AND a.id > b.id); 
相关问题