सेल्फ-जॉइन से डुप्लीकेट मान वाली पंक्तियाँ खोजें
किसी कॉलम में डुप्लीकेट मान वाली सभी पंक्तियाँ खोजने के लिए सेल्फ-जॉइन (JOIN टेबल को स्वयं से) का उपयोग करें।
टेबल और डेटा
mysql> CREATE TABLE DemoTable (UserId INT, UserName VARCHAR(20));
mysql> INSERT INTO DemoTable VALUES(10,'John'), (11,'Sam'), (12,'Larry'), (13,'David'), (14,'Larry');
डेटा देखना
mysql> SELECT * FROM DemoTable;
+--------+----------+
| UserId | UserName |
+--------+----------+
| 10 | John |
| 11 | Sam |
| 12 | Larry |
| 13 | David |
| 14 | Larry |
+--------+----------+
डुप्लीकेट खोजने की क्वेरी
mysql> SELECT DISTINCT tbl1.*
-> FROM DemoTable tbl1
-> JOIN DemoTable tbl2
-> ON tbl2.UserId <> tbl1.UserId AND tbl2.UserName = tbl1.UserName;
+--------+----------+
| UserId | UserName |
+--------+----------+
| 14 | Larry |
| 12 | Larry |
+--------+----------+
कैसे काम करता है
- टेबल को दो एलियास (
tbl1,tbl2) के साथ जॉइन करता है tbl2.UserId <> tbl1.UserId- स्वयं से जुड़ने से रोकता हैtbl2.UserName = tbl1.UserName- समान नाम वाली पंक्तियाँ मिलाता हैDISTINCT- डुप्लीकेट परिणाम पंक्तियाँ हटाता है
बेहतर विकल्प: GROUP BY + HAVING
-- केवल डुप्लीकेट मान दिखाना
SELECT UserName FROM DemoTable
GROUP BY UserName
HAVING COUNT(*) > 1;
-- डुप्लीकेट वाली सभी पंक्तियाँ
SELECT * FROM DemoTable
WHERE UserName IN (
SELECT UserName FROM DemoTable
GROUP BY UserName
HAVING COUNT(*) > 1
);
डुप्लीकेट गिनती के साथ
SELECT UserName, COUNT(*) AS cnt
FROM DemoTable
GROUP BY UserName
HAVING cnt > 1;
प्रदर्शन नोट
बड़े टेबल पर GROUP BY ... HAVING दृष्टिकोण आमतौर पर सेल्फ-जॉइन से तेज होता है, विशेष रूप से जब कॉलम इंडेक्स्ड हो।