Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Memadam Rekod Pendua dalam MySQL Semasa Mengekalkan Yang Terkini?

Bagaimana untuk Memadam Rekod Pendua dalam MySQL Semasa Mengekalkan Yang Terkini?

Mary-Kate Olsen
Lepaskan: 2024-12-01 13:30:11
asal
314 orang telah melayarinya

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

Cara Memadam Rekod Pendua dalam MySQL Semasa Mengekalkan Yang Terkini

Apabila berurusan dengan jadual yang mengandungi pengecam unik dan alamat e-mel pendua, ia adalah selalunya perlu untuk mengalih keluar pendua ini sambil mengekalkan rekod terkini. MySQL menyediakan beberapa kaedah untuk mencapai objektif ini.

Satu pendekatan melibatkan mengenal pasti alamat e-mel yang diulang dan mencari rekod terkini, yang diwakili oleh ID maksimum, untuk setiap e-mel ini. Ini boleh dilakukan menggunakan gabungan fungsi GROUP BY, HAVING dan MAX().

Setelah rekod terbaharu dikenal pasti, langkah seterusnya ialah memadam semua rekod pendua dengan ID yang lebih rendah daripada rekod tersebut ID maksimum masing-masing. Ini boleh dicapai dengan kenyataan DELETE yang menggunakan INNER JOIN untuk membandingkan alamat e-mel dan nilai ID.

Contoh Jadual Pangkalan Data

Untuk menggambarkan proses ini, pertimbangkan jadual berikut bernama "ujian":

    ID                     EMAIL                
    ---------------------- -------------------- 
    1                      aaa                  
    2                      bbb                  
    3                      ccc                  
    4                      bbb                  
    5                      ddd                  
    6                      eee                  
    7                      aaa                  
    8                      aaa                  
    9                      eee 
Salin selepas log masuk

Mengenal pasti Pendua E-mel

    select email 
    from test
    group by email
    having count(*) > 1;
Salin selepas log masuk

Pertanyaan ini mengembalikan hasil berikut, menunjukkan bahawa 'aaa', 'bbb' dan 'eee' ialah e-mel berulang:

    EMAIL                
    -------------------- 
    aaa                  
    bbb                  
    eee  
Salin selepas log masuk

Mencari Rekod Terkini

    select max(id) as lastId, email
    from test
    where email in (
        select email 
        from test
        group by email
        having count(*) > 1
    )
    group by email;
Salin selepas log masuk

Pertanyaan ini mendapatkan semula ID maksimum dan alamat e-mel yang sepadan untuk setiap pendua:

    LASTID                 EMAIL                
    ---------------------- -------------------- 
    8                      aaa                  
    4                      bbb                  
    9                      eee                                 
Salin selepas log masuk

Memadam Rekod Pendua

    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;
Salin selepas log masuk

Selepas melaksanakan pertanyaan ini, jadual "ujian" akan mengandungi hanya yang paling terkini rekod untuk setiap alamat e-mel, mengakibatkan perkara berikut data:

    +----+-------+
    | id | email |
    +----+-------+
    |  3 | ccc   |
    |  4 | bbb   |
    |  5 | ddd   |
    |  8 | aaa   |
    |  9 | eee   |
    +----+-------+
Salin selepas log masuk

Pertanyaan Padam Dioptimumkan

Pertanyaan pemadaman alternatif yang lebih dioptimumkan disediakan di bawah:

    delete from test
    where id not in (
        select max(id)
        from test
        group by email)
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Memadam Rekod Pendua dalam MySQL Semasa Mengekalkan Yang Terkini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan