Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL डुप्लिकेट रिकॉर्ड हटाएं लेकिन नवीनतम रखें

अपनी तालिका की कल्पना करें test निम्नलिखित डेटा शामिल है:

  select id, email
    from test;

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

इसलिए, हमें दोहराए गए सभी ईमेल ढूंढने होंगे और उन सभी को हटाना होगा, लेकिन नवीनतम आईडी को।
इस मामले में, aaa , bbb और eee दोहराए जाते हैं, इसलिए हम 1, 7, 2 और 6 आईडी हटाना चाहते हैं।

इसे पूरा करने के लिए, पहले हमें दोहराए गए सभी ईमेल खोजने होंगे:

      select email 
        from test
       group by email
      having count(*) > 1;

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;

LASTID                 EMAIL                
---------------------- -------------------- 
8                      aaa                  
4                      bbb                  
9                      eee                                 

अंत में अब हम LASTID से छोटी आईडी वाले इन सभी ईमेल को हटा सकते हैं। तो समाधान है:

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;

मेरे पास अभी इस मशीन पर mySql स्थापित नहीं है, लेकिन काम करना चाहिए

अपडेट करें

उपरोक्त डिलीट काम करता है, लेकिन मुझे एक अधिक अनुकूलित संस्करण मिला:

 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;

आप देख सकते हैं कि यह सबसे पुराने डुप्लिकेट को हटा देता है, अर्थात 1, 7, 2, 6:

select * from test;
+----+-------+
| id | email |
+----+-------+
|  3 | ccc   |
|  4 | bbb   |
|  5 | ddd   |
|  8 | aaa   |
|  9 | eee   |
+----+-------+

एक अन्य संस्करण, Rene Limon द्वारा सिद्ध किया गया डिलीट है।

delete from test
 where id not in (
    select max(id)
      from test
     group by email)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL संस्करण का निर्धारण कैसे करें

  2. MySQL वर्चर इंडेक्स लंबाई

  3. एक कॉलम के MySql योग तत्व

  4. MySQL डेटाबेस को Amazon RDS से DigitalOcean में माइग्रेट करना

  5. कैसे php में एक सुरक्षित mysql तैयार बयान बनाने के लिए?