MySQL: 最新のレコードを保持しながら重複レコードを削除する
質問: で重複する電子メール アドレスを削除するにはどうすればよいですか?一意の ID に基づいて最新のテーブルを保持しながら MySQL テーブルを作成するフィールド?
解決策:
これを実現するには、次の手順に従います:
重複の識別電子メール:
クエリを使用して、重複するすべての電子メール アドレスのリストを取得します:
SELECT email FROM test GROUP BY email HAVING COUNT(*) > 1;
それぞれの最新の ID を見つける重複:
クエリを使用して、各重複電子メールに関連付けられた最新の ID を確認します:
SELECT MAX(id) AS lastID, email FROM test WHERE email IN ( SELECT email FROM test GROUP BY email HAVING COUNT(*) > 1 ) GROUP BY email;
最も古いものを削除重複:
DELETE 操作を実行して、最新の ID よりも小さい ID を持つ重複メールを削除します:
DELETE test FROM test INNER JOIN ( SELECT MAX(id) AS lastID, email FROM test WHERE email IN ( SELECT email FROM test GROUP BY email HAVING COUNT(*) > 1 ) GROUP BY email ) duplic ON duplic.email = test.email WHERE test.id < duplic.lastID;
最適化済みバージョン:
次の最適化されたバージョンは、パフォーマンスを向上させながら同じ結果を提供します:
DELETE test FROM test INNER JOIN ( SELECT MAX(id) AS lastID, email FROM test GROUP BY email HAVING COUNT(*) > 1) duplic ON duplic.email = test.email WHERE test.id < duplic.lastID;
この改訂された DELETE ステートメントは、最も古い重複を削除することに重点を置いています。
追加オプション:
または、次のクエリを利用することもできます。 Rene Limon:
DELETE FROM test WHERE id NOT IN ( SELECT MAX(id) FROM test GROUP BY email);
このアプローチでは、最大 ID に基づいて最新の重複電子メール アドレスが保持されます。
以上が最新の記録を保持しながら、MySQL で重複する電子メール アドレスを削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。