删除除MySQL中的One之外的所有重复行?

时间:2011-01-13 20:58:38

标签: mysql sql duplicates

  

可能重复:
  Remove duplicate rows in 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执行此操作以仅删除重复项并仅保留每条记录的一条记录?

2 个答案:

答案 0 :(得分:889)

  

编辑器警告:此解决方案在计算上效率低下,可能会降低大型表的连接。

注意 - 您需要首先在表格的测试副本上执行此操作!

当我这样做时,我发现除非我也包含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
    
  3. 我在MySQL 5.1中使用了这个方法

    不确定其他版本。


    更新:由于人们谷歌搜索删除重复项目最终在这里
    虽然OP的问题是DELETE,但请注意,使用INSERTDISTINCT要快得多。对于具有800万行的数据库,以下查询花费了13分钟,而使用DELETE时,花费了超过2小时但尚未完成。

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

答案 1 :(得分:181)

如果要保留行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错误。