0

次のようなmysqlテーブルがあります。

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

どの列にあるかに関係なく、2 つの重複する値を持つ行を削除したいので、例は次のようになります。

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

2段階のアプローチをお勧めします:

  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 に答える