Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: ดึงเฉพาะข้อมูลซ้ำ และนับจำนวนครั้งที่ซ้ำ

การค้นหาข้อมูลซ้ำและนับจำนวนด้วย 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;