最新のレコードを保持しながら MySQL の重複レコードを削除する方法
一意の識別子と重複する電子メール アドレスを含むテーブルを扱う場合、次のようになります。多くの場合、最新のレコードを保持しながらこれらの重複を削除する必要があります。 MySQL は、この目的を達成するためにいくつかの方法を提供します。
1 つのアプローチには、繰り返される電子メール アドレスを特定し、これらの電子メールごとに最大 ID で表される最新のレコードを見つけることが含まれます。これは、GROUP BY、HAVING、MAX() 関数を組み合わせて使用できます。
最新のレコードが特定されたら、次のステップは、そのレコードよりも低い ID を持つ重複レコードをすべて削除することです。それぞれの最大ID。これは、INNER JOIN を使用して電子メール アドレスと ID 値を比較する DELETE ステートメントで実行できます。
データベース テーブルの例
このプロセスを説明するには、 「test」という名前の次のテーブル:
ID EMAIL ---------------------- -------------------- 1 aaa 2 bbb 3 ccc 4 bbb 5 ddd 6 eee 7 aaa 8 aaa 9 eee
重複の識別電子メール
select email from test group by email having count(*) > 1;
このクエリは、「aaa」、「bbb」、および「eee」が繰り返される電子メールであることを示す次の結果を返します。
EMAIL -------------------- aaa bbb eee
最新のレコードの検索
select max(id) as lastId, email from test where email in ( select email from test group by email having count(*) > 1 ) group by email;
このクエリは次の内容を取得します各重複の最大 ID と対応する電子メール アドレス:
LASTID EMAIL ---------------------- -------------------- 8 aaa 4 bbb 9 eee
重複レコードの削除
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;
このクエリを実行すると、「test」テーブルには次の内容が含まれます。各電子メール アドレスの最新のレコードのみが表示され、次の結果が得られます。データ:
+----+-------+ | id | email | +----+-------+ | 3 | ccc | | 4 | bbb | | 5 | ddd | | 8 | aaa | | 9 | eee | +----+-------+
最適化された削除クエリ
より最適化された代替の削除クエリを以下に示します:
delete from test where id not in ( select max(id) from test group by email)
以上がMySQL で最新のレコードを保持したまま重複レコードを削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。