0

我有一个 mysql 表,它看起来像这样:

id_one     id_two
1          2
2          1
3          2
2          3
4          5
5          4

我想删除具有两个重复值的行,而不管它们在哪些列中,因此示例如下所示:

id_one     id_two
1          2
3          2
5          4

总共有超过 1200 万行。关于我应该如何做到这一点的任何想法?首选 PHP 或 mysql 查询。

4

3 回答 3

1
DELETE a
FROM table1 a
LEFT JOIN
    (
      select id_one, id_two
      from   Table1
      GROUP BY least(id_one, id_two), greatest(id_one, id_two)
    ) b ON a.id_one = b.id_one AND a.id_two = b.id_two
WHERE b.id_two IS NULL
于 2013-01-06T11:32:53.973 回答
0

我建议采用两步法:

  1. 使 id_one 总是较小的值,即,如果 id_one 大于 id_two 则交换它们的值 - 考虑这样的事情(取自此处):

    UPDATE tablename
    SET id_one = (@temp:=id_one), id_one = id_two, id_two = @temp
    WHERE id_one > id_two
    
  2. 按照此处所述删除重复项:

    DELETE tablename FROM tablename INNER JOIN
        (SELECT min(primary_key) AS min_id, id_one, id_two FROM tablename
         GROUP BY id_one, id_two
         HAVING count(1) > 1) AS d
    ON (d.id_one = tablename.id_one
        AND d.id_two = tablename.id_two
        AND d.min_id <> tablename.primary_key)
    

    (我假设您将在包含 1200 万个条目的表上拥有一个主键。)

未测试,所以请备份您的数据!

于 2013-01-06T11:19:03.287 回答
0
DELETE FROM ztable zt
WHERE zt.id_one > zt.id_two
  AND EXISTS (
    SELECT * 
    FROM ztable tx
    WHERE tx.id_one = zt.id_two
      AND tx.id_two = zt.id_one
    )
    ;

在 mysql 中不起作用,因为在 mysql 中您无法引用正在更新或删除的表。由于您无论如何都想制作备份副本,因此您可以在 EXISTS 子查询中使用它:

CREATE table safetable AS (SELECT * from ztable);

DELETE FROM ztable zt 
WHERE zt.id_one > zt.id_two 
AND EXISTS (
   SELECT * 
   FROM safetable tx
   WHERE tx.id_one = zt.id_two 
     AND tx.id_two = zt.id_one
   );
于 2013-01-06T11:27:21.427 回答