Hig*_*ife 403 mysql sql duplicates
可能重复:
删除MySQL中的重复行
如何从MySQL表中删除所有重复数据?
例如,使用以下数据:
SELECT * FROM names;
+----+--------+
| id | name |
+----+--------+
| 1 | google |
| 2 | yahoo |
| 3 | msn |
| 4 | google |
| 5 | google |
| 6 | yahoo |
+----+--------+
Run Code Online (Sandbox Code Playgroud)
我会使用,SELECT DISTINCT name FROM names;
如果它是一个SELECT
查询.
我怎么做DELETE
才能删除重复项并保留每个重复记录?
小智 913
编辑器警告:此解决方案在计算上效率低下,可能会导致大型表的连接断开.
注意 - 您需要先在桌子的测试副本上执行此操作!
当我这样做时,我发现除非我也包括在内AND n1.id <> n2.id
,否则它会删除表格中的每一行.
如果要保持行具有最低id
值:
DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
Run Code Online (Sandbox Code Playgroud)如果要保留具有最高id
值的行:
DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
Run Code Online (Sandbox Code Playgroud)我在MySQL 5.1中使用了这种方法
不确定其他版本.
更新:由于人们谷歌搜索删除重复项最终在这里
尽管OP的问题是关于DELETE
,请注意使用INSERT
和DISTINCT
更快.对于具有800万行的数据库,以下查询花费了13分钟,而在使用时DELETE
,花费了超过2小时但尚未完成.
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
SELECT DISTINCT cellId,attributeId,entityRowId,value
FROM tableName;
Run Code Online (Sandbox Code Playgroud)
OMG*_*ies 187
如果要保持行具有最低id
值:
DELETE FROM NAMES
WHERE id NOT IN (SELECT *
FROM (SELECT MIN(n.id)
FROM NAMES n
GROUP BY n.name) x)
Run Code Online (Sandbox Code Playgroud)
如果您想要id
最高的值:
DELETE FROM NAMES
WHERE id NOT IN (SELECT *
FROM (SELECT MAX(n.id)
FROM NAMES n
GROUP BY n.name) x)
Run Code Online (Sandbox Code Playgroud)
子查询中的子查询对于MySQL是必需的,否则您将收到1093错误.
归档时间: |
|
查看次数: |
441516 次 |
最近记录: |