การค้นหาข้อมูลซ้ำและนับจำนวนด้วย GROUP BY และ HAVING
ใช้ GROUP BY จัดกลุ่มข้อมูล และ HAVING COUNT(*) > 1 กรองเฉพาะกลุ่มที่มีข้อมูลซ้ำ พร้อมแสดงจำนวนครั้งที่ซ้ำ
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูลซ้ำ:
mysql> CREATE TABLE duplicateRecords (
-> ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ClientName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.49 sec)
mysql> INSERT INTO duplicateRecords(ClientName) VALUES('John');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO duplicateRecords(ClientName) VALUES('Carol');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO duplicateRecords(ClientName) VALUES('John');
Query OK, 1 row affected (0.29 sec)
mysql> INSERT INTO duplicateRecords(ClientName) VALUES('Sam');
Query OK, 1 row affected (0.19 sec)
mysql> INSERT INTO duplicateRecords(ClientName) VALUES('Sam');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO duplicateRecords(ClientName) VALUES('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO duplicateRecords(ClientName) VALUES('John');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO duplicateRecords(ClientName) VALUES('Sam');
Query OK, 1 row affected (0.12 sec)
ข้อมูลทั้งหมด:
mysql> SELECT * FROM duplicateRecords;
+----------+------------+
| ClientId | ClientName |
+----------+------------+
| 1 | John |
| 2 | Carol |
| 3 | John |
| 4 | Sam |
| 5 | Sam |
| 6 | Bob |
| 7 | John |
| 8 | Sam |
+----------+------------+
8 rows in set (0.00 sec)
คำสั่งดึงเฉพาะชื่อที่ซ้ำพร้มนับจำนวน:
mysql> SELECT ClientName, COUNT(*) AS DuplicateRecord
-> FROM duplicateRecords
-> GROUP BY ClientName
-> HAVING DuplicateRecord > 1;
ผลลัพธ์:
+------------+-----------------+
| ClientName | DuplicateRecord |
+------------+-----------------+
| John | 3 |
| Sam | 3 |
+------------+-----------------+
2 rows in set (0.00 sec)
คำอธิบาย
GROUP BY ClientNameจัดกลุ่มแถวที่มีชื่อเหมือนกันCOUNT(*)นับจำนวนแถวในแต่ละกลุ่มHAVING DuplicateRecord > 1กรองเฉพาะกลุ่มที่มีมากกว่า 1 แถว (คือซ้ำ)- ต่างจาก
WHEREที่กรองก่อนจัดกลุ่มHAVINGกรองหลังจัดกลุ่มแล้ว
เคล็ดลับ: หากต้องการดูรายละเอียดแถวที่ซ้ำ (รวม ID) ให้ใช้ Subquery หรือ Window Function (MySQL 8.0+): SELECT * FROM (SELECT *, COUNT(*) OVER (PARTITION BY ClientName) AS cnt FROM duplicateRecords) t WHERE cnt > 1;