删除mysql中的重复行,只保留id最低的行

删除mysql中的重复行,只保留id最低的行,mysql,sql-delete,Mysql,Sql Delete,我想删除除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

我想删除除
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行。

使用mysql的多表删除语法和自连接:

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);
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

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

是的。保持最低id行将不起作用…是的,
*
位错误我运行了该命令,但它需要很多时间。我有一个超过200万行的大型数据库。@jaki在任何一个非id列上放置了一个索引,该列具有最多的不同值。如果不同值的数量小于约100,则在两列上建立索引,第二列为非id列,不同值的数量位居第二。我考虑逐个手动运行代码,而不是同时运行所有代码。如果文件为“a”,则检查并删除文件为“a”的所有重复项。将代码放在哪里?@jaki将其添加到末尾:
和a.file='a'
谢谢您的帮助