删除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错误。