Maison > base de données > tutoriel mysql > Comment supprimer les enregistrements en double dans MySQL tout en conservant les dernières ?

Comment supprimer les enregistrements en double dans MySQL tout en conservant les dernières ?

Mary-Kate Olsen
Libérer: 2024-12-01 13:30:11
original
273 Les gens l'ont consulté

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

Comment supprimer les enregistrements en double dans MySQL tout en conservant les dernières

Lorsque vous traitez des tables contenant des identifiants uniques et des adresses e-mail en double, il est il est souvent nécessaire de supprimer ces doublons tout en préservant l'enregistrement le plus récent. MySQL propose plusieurs méthodes pour atteindre cet objectif.

Une approche consiste à identifier les adresses e-mail répétées et à trouver l'enregistrement le plus récent, représenté par l'ID maximum, pour chacun de ces e-mails. Cela peut être fait en utilisant une combinaison des fonctions GROUP BY, HAVING et MAX().

Une fois les enregistrements les plus récents identifiés, l'étape suivante consiste à supprimer tous les enregistrements en double avec un ID inférieur à leur ID maximum respectif. Cela peut être accompli avec une instruction DELETE qui utilise un INNER JOIN pour comparer les adresses e-mail et les valeurs d'ID.

Exemple de table de base de données

Pour illustrer ce processus, considérons le tableau suivant nommé "test":

    ID                     EMAIL                
    ---------------------- -------------------- 
    1                      aaa                  
    2                      bbb                  
    3                      ccc                  
    4                      bbb                  
    5                      ddd                  
    6                      eee                  
    7                      aaa                  
    8                      aaa                  
    9                      eee 
Copier après la connexion

Identification du doublon E-mails

    select email 
    from test
    group by email
    having count(*) > 1;
Copier après la connexion

Cette requête renvoie le résultat suivant, indiquant que « aaa », « bbb » et « eee » sont des e-mails répétés :

    EMAIL                
    -------------------- 
    aaa                  
    bbb                  
    eee  
Copier après la connexion

Recherche des enregistrements les plus récents

    select max(id) as lastId, email
    from test
    where email in (
        select email 
        from test
        group by email
        having count(*) > 1
    )
    group by email;
Copier après la connexion

Cette requête récupère l'ID maximum et l'adresse e-mail correspondante pour chaque duplicate :

    LASTID                 EMAIL                
    ---------------------- -------------------- 
    8                      aaa                  
    4                      bbb                  
    9                      eee                                 
Copier après la connexion

Suppression des enregistrements en double

    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;
Copier après la connexion

Après avoir exécuté cette requête, la table "test" contiendra uniquement les enregistrements les plus récents pour chaque adresse e-mail , ce qui donne les données suivantes :

    +----+-------+
    | id | email |
    +----+-------+
    |  3 | ccc   |
    |  4 | bbb   |
    |  5 | ddd   |
    |  8 | aaa   |
    |  9 | eee   |
    +----+-------+
Copier après la connexion

Suppression optimisée Requête

Une requête de suppression alternative, plus optimisée, est fournie ci-dessous :

    delete from test
    where id not in (
        select max(id)
        from test
        group by email)
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal