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

तालिका में डुप्लिकेट के प्रत्येक सेट की एक पंक्ति को छोड़कर सभी को कैसे चुनें और/या हटाएं?

यहाँ एक समाधान है। मैंने MySQL 5.5.8 पर इसका परीक्षण किया।

SELECT MAX(COALESCE(c2.id, c1.id)) AS id,
 c1.driver_id, c1.car_id,
 c2.notes AS notes
FROM cars_drivers AS c1
LEFT OUTER JOIN cars_drivers AS c2
 ON (c1.driver_id,c1.car_id) = (c2.driver_id,c2.car_id) AND c2.notes IS NOT NULL
GROUP BY c1.driver_id, c1.car_id, c2.notes;

मैं c2.notes को GROUP BY कुंजी के रूप में शामिल करता हूं क्योंकि आपके पास ड्राइवर_आईडी, car_id के प्रति मान गैर-शून्य नोटों के साथ एक से अधिक पंक्तियाँ हो सकती हैं।

आपके उदाहरण डेटा का उपयोग करके परिणाम:

+------+-----------+--------+-------+
| id   | driver_id | car_id | notes |
+------+-----------+--------+-------+
|    2 |         1 |      1 | NULL  |
|    4 |         2 |      1 | NULL  |
|    8 |         3 |      2 | hi    |
|    9 |         5 |      3 | NULL  |
+------+-----------+--------+-------+

हटाने बाबत। आपके उदाहरण डेटा में, यह हमेशा प्रति ड्राइवर_आईडी और कार_आईडी का उच्चतम आईडी मान होता है जिसे आप रखना चाहते हैं। यदि आप उस पर निर्भर हो सकते हैं, तो आप एक मल्टी-टेबल डिलीट कर सकते हैं जो उन सभी पंक्तियों को हटा देता है जिनके लिए एक उच्च आईडी मान वाली पंक्ति और एक ही ड्राइवर_आईडी और कार_आईडी मौजूद है:

DELETE c1 FROM cars_drivers AS c1 INNER JOIN cars_drivers AS c2
 ON (c1.driver_id,c1.car_id) = (c2.driver_id,c2.car_id) AND c1.id < c2.id;

यह स्वाभाविक रूप से ऐसे किसी भी मामले को छोड़ देता है जहां दिए गए ड्राइवर_आईडी और कार_आईडी मानों की जोड़ी के साथ केवल एक पंक्ति मौजूद होती है, क्योंकि आंतरिक जुड़ाव की स्थितियों के लिए अलग-अलग आईडी मानों वाली दो पंक्तियों की आवश्यकता होती है।

लेकिन अगर आप प्रति समूह नवीनतम आईडी पर निर्भर नहीं रह सकते हैं जिसे आप रखना चाहते हैं, तो समाधान अधिक जटिल है। यह शायद एक कथन में हल करने की तुलना में अधिक जटिल है, इसलिए इसे दो कथनों में करें।

परीक्षण के लिए कुछ और पंक्तियों को जोड़ने के बाद, मैंने इसका भी परीक्षण किया:

INSERT INTO cars_drivers VALUES (10,2,3,NULL), (11,2,3,'bye');

+----+--------+-----------+-------+
| id | car_id | driver_id | notes |
+----+--------+-----------+-------+
|  1 |      1 |         1 | NULL  |
|  2 |      1 |         1 | NULL  |
|  3 |      1 |         2 | NULL  |
|  4 |      1 |         2 | NULL  |
|  5 |      2 |         3 | NULL  |
|  6 |      2 |         3 | NULL  |
|  7 |      2 |         3 | NULL  |
|  8 |      2 |         3 | hi    |
|  9 |      3 |         5 | NULL  |
| 10 |      2 |         3 | NULL  |
| 11 |      2 |         3 | bye   |
+----+--------+-----------+-------+

पहले रिक्त नोट वाली पंक्तियों को हटाएं, जहां गैर-शून्य नोटों वाली एक पंक्ति मौजूद है।

DELETE c1 FROM cars_drivers AS c1 INNER JOIN cars_drivers AS c2
 ON (c1.driver_id,c1.car_id) = (c2.driver_id,c2.car_id)
WHERE c1.notes IS NULL AND c2.notes IS NOT NULL;

+----+--------+-----------+-------+
| id | car_id | driver_id | notes |
+----+--------+-----------+-------+
|  1 |      1 |         1 | NULL  |
|  2 |      1 |         1 | NULL  |
|  3 |      1 |         2 | NULL  |
|  4 |      1 |         2 | NULL  |
|  8 |      2 |         3 | hi    |
|  9 |      3 |         5 | NULL  |
| 11 |      2 |         3 | bye   |
+----+--------+-----------+-------+

दूसरा, डुप्लीकेट के प्रत्येक समूह से उच्चतम-आईडी पंक्ति को छोड़कर सभी हटाएं।

DELETE c1 FROM cars_drivers AS c1 INNER JOIN cars_drivers AS c2
 ON (c1.driver_id,c1.car_id) = (c2.driver_id,c2.car_id) AND c1.id < c2.id;

+----+--------+-----------+-------+
| id | car_id | driver_id | notes |
+----+--------+-----------+-------+
|  2 |      1 |         1 | NULL  |
|  4 |      1 |         2 | NULL  |
|  9 |      3 |         5 | NULL  |
| 11 |      2 |         3 | bye   |
+----+--------+-----------+-------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक php पृष्ठ में दो तालिकाओं का प्रयोग करें (mysql)

  2. मल्टीथ्रेडिंग त्रुटि:पहले से ही इस कनेक्शन से जुड़ा एक खुला डेटा रीडर है जिसे पहले बंद किया जाना चाहिए

  3. PHP और MySQL फ़ाइलों को कैसे अपलोड और डाउनलोड करें

  4. LOCALTIMESTAMP उदाहरण – MySQL

  5. कोल्डफ्यूजन 9 के <CFQUERY>-Tag . के साथ MySQL5 में एक संग्रहीत कार्यविधि बनाना