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

MySQL หาข้อมูลซ้ำ (Duplicate Tuples) และนับจำนวนด้วย GROUP BY HAVING

ใช้ 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