删除MySQL中除了一个之外的所有重复行?

可能重复:
删除MySQL中的重复行

我如何删除MySQL表中的所有重复数据?

例如,用以下数据:

SELECT * FROM names; 
 +----+--------+ | id | name | +----+--------+ | 1 | google | | 2 | yahoo | | 3 | msn | | 4 | google | | 5 | google | | 6 | yahoo | +----+--------+ 

我将使用SELECT DISTINCT name FROM names; 如果它是一个SELECT查询。 我怎样才能做到这一点与DELETE删除重复只保留每个logging?

注意 – 您需要先在桌面的testing副本上执行此操作!

当我这样做的时候,我发现除非我还包含AND n1.id <> n2.id ,它会删除表中的每一行。

1)如果你想保持最低的id值的行:

 DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name 

2)如果你想保持最高的id值的行:

 DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name 

我在MySQL 5.1中使用了这个方法

不确定其他版本。

更新:由于人们谷歌去除重复结束在这里
尽pipeOP的问题是关于DELETE,但是请注意,使用INSERT和DISTINCT要快得多。 对于有800万行的数据库,下面的查询花费了13分钟,而使用DELETE时,花费了2个多小时,但没有完成。

 INSERT INTO tempTableName(cellId,attributeId,entityRowId,value) SELECT DISTINCT cellId,attributeId,entityRowId,value FROM tableName; 

如果您想保留具有最低id值的行:

 DELETE FROM NAMES WHERE id NOT IN (SELECT * FROM (SELECT MIN(n.id) FROM NAMES n GROUP BY n.name) x) 

如果你想要最高的id值:

 DELETE FROM NAMES WHERE id NOT IN (SELECT * FROM (SELECT MAX(n.id) FROM NAMES n GROUP BY n.name) x) 

子查询中的子查询对于MySQL来说是必要的,否则你会得到一个1093错误。