MySQL で 1 行を除くすべての重複行を削除しますか? [重複] 質問する

MySQL で 1 行を除くすべての重複行を削除しますか? [重複] 質問する

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重複を削除し、それぞれ 1 つのレコードのみを保持するには、どうすればよいでしょうか?

ベストアンサー1

編集者の警告: このソリューションは計算効率が悪く、大きなテーブルでは接続がダウンする可能性があります。

注意 -最初にテーブルのテスト コピーでこれを実行する必要があります。

実行してみると、 も含めないと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
    

私はMySQL 5.1でこの方法を使用しました

他のバージョンについては不明です。


更新: 重複の削除について Google で検索している人はここにたどり着くので、
OP の質問は に関するものですが、 と を使用するとはるかに高速になるDELETEことにご注意ください。800 万行のデータベースの場合、以下のクエリには 13 分かかりましたが、 を使用すると2 時間以上かかり、それでも完了しませんでした。INSERTDISTINCTDELETE

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

おすすめ記事