ホームページ > データベース > mysql チュートリアル > MySQL で最新のレコードを保持したまま重複レコードを削除するにはどうすればよいですか?

MySQL で最新のレコードを保持したまま重複レコードを削除するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-01 13:30:11
オリジナル
314 人が閲覧しました

How to Delete Duplicate Records in MySQL While Retaining the Latest?

最新のレコードを保持しながら 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート