ใช้ GROUP BY ร่วมกับ HAVING COUNT(*) > n เพื่อค้นหาแถวข้อมูลที่ซ้ำกัน (Duplicate Tuples) และนับจำนวนครั้งที่ซ้ำ
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable (
Id INT,
Name VARCHAR(20)
);
Query OK, 0 rows affected (0.80 sec)
2. เพิ่มข้อมูล (มีค่าซ้ำ)
mysql> INSERT INTO DemoTable VALUES(100, 'Chris'); mysql> INSERT INTO DemoTable VALUES(101, 'David'); mysql> INSERT INTO DemoTable VALUES(101, 'Mike'); mysql> INSERT INTO DemoTable VALUES(100, 'Carol'); mysql> INSERT INTO DemoTable VALUES(100, 'Chris'); -- ซ้ำกับแถวแรก mysql> INSERT INTO DemoTable VALUES(100, 'Chris'); -- ซ้ำอีกครั้ง
3. แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable; +------+-------+ | Id | Name | +------+-------+ | 100 | Chris | | 101 | David | | 101 | Mike | | 100 | Carol | | 100 | Chris | | 100 | Chris | +------+-------+
4. หาคู่ (Id, Name) ที่ซ้ำมากกว่า 2 ครั้ง
mysql> SELECT Id, Name, COUNT(*) AS t
-> FROM DemoTable
-> GROUP BY Id, Name
-> HAVING COUNT(*) > 2;
5. ผลลัพธ์
+------+-------+---+ | Id | Name | t | +------+-------+---+ | 100 | Chris | 3 | +------+-------+---+
คำอธิบาย
GROUP BY Id, Name: จัดกลุ่มตามคู่ (Id, Name) - ถือว่า Tuple ซ้ำเมื่อทั้งสองคอลัมน์เหมือนกันCOUNT(*): นับจำนวนแถวในแต่ละกลุ่มHAVING COUNT(*) > 2: กรองเฉพาะกลุ่มที่มีมากกว่า 2 แถว (คือซ้ำ 3 ครั้งขึ้นไป)
Query เพิ่มเติมที่มีประโยชน์
หาข้อมูลซ้ำทุกประเภท (ซ้ำ 2 ครั้งขึ้นไป)
SELECT Id, Name, COUNT(*) AS cnt FROM DemoTable GROUP BY Id, Name HAVING COUNT(*) >= 2 ORDER BY cnt DESC;
ลบข้อมูลซ้ำ เหลือแค่ 1 แถว (เก็บแถวแรก)
DELETE t1 FROM DemoTable t1 INNER JOIN DemoTable t2 WHERE t1.Id = t2.Id AND t1.Name = t2.Name AND t1.ctid > t2.ctid; -- หมายเหตุ: MySQL ไม่มี ctid ต้องใช้ Primary Key หรือ ROW_ID แทน
สรุป
GROUP BY ... HAVING COUNT(*) > n เป็นวิธีมาตรฐานในการหาข้อมูลซ้ำ (Duplicates) ใน SQL ใช้ได้กับทุก Database ไม่ใช่แค่ MySQL