关于sql:删除除MySQL中的One之外的所有重复行?

Delete all Duplicate Rows except for One in MySQL?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Remove duplicate rows in MySQL

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

例如,使用以下数据:

1
2
3
4
5
6
7
8
9
10
11
12
SELECT * FROM names;

+----+--------+
| id | name   |
+----+--------+
| 1  | google |
| 2  | yahoo  |
| 3  | msn    |
| 4  | google |
| 5  | google |
| 6  | yahoo  |
+----+--------+

如果是SELECT查询,我会使用SELECT DISTINCT name FROM names;

如何使用DELETE执行此操作以仅删除重复项并仅保留每条记录的一条记录?


Editor warning: This solution is computationally inefficient and may bring down your connection for a large table.

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

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

  • 如果要保留具有最低id值的行:

    1
    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
  • 如果要保留具有最高id值的行:

    1
    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
  • 我在MySQL 5.1中使用了这种方法

    不确定其他版本。

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

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


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

    1
    2
    3
    4
    5
    DELETE FROM NAMES
     WHERE id NOT IN (SELECT *
                        FROM (SELECT MIN(n.id)
                                FROM NAMES n
                            GROUP BY n.name) x)

    如果您想要最高的id值:

    1
    2
    3
    4
    5
    DELETE FROM NAMES
     WHERE id NOT IN (SELECT *
                        FROM (SELECT MAX(n.id)
                                FROM NAMES n
                            GROUP BY n.name) x)

    子查询中的子查询对于MySQL是必需的,否则您将收到1093错误。