วัตถุประสงค์
ค้นหาค่าในคอลัมน์ที่ปรากฏซ้ำเกินจำนวนที่กำหนด (เช่น มากกว่า 2 ครั้ง) พร้อมแสดงจำนวนครั้งที่ซ้ำ
ตัวอย่างข้อมูล
mysql> CREATE TABLE DemoTable1467 (
Id INT,
Name VARCHAR(20)
);
INSERT INTO DemoTable1467 VALUES (100, 'Chris');
INSERT INTO DemoTable1467 VALUES (110, 'David');
INSERT INTO DemoTable1467 VALUES (120, 'Mike');
INSERT INTO DemoTable1467 VALUES (100, 'Chris');
INSERT INTO DemoTable1467 VALUES (130, 'Carol');
INSERT INTO DemoTable1467 VALUES (100, 'Chris');
ข้อมูลทั้งหมด 6 แถว
+------+-------+
| Id | Name |
+------+-------+
| 100 | Chris |
| 110 | David |
| 120 | Mike |
| 100 | Chris |
| 130 | Carol |
| 100 | Chris |
+------+-------+
Query ค้นหาค่าที่ซ้ำมากกว่า 2 ครั้ง
mysql> SELECT Id, Name, COUNT(*) AS IdCount
-> FROM DemoTable1467
-> GROUP BY Id, Name
-> HAVING IdCount > 2;
ผลลัพธ์
+------+-------+---------+
| Id | Name | IdCount |
+------+-------+---------+
| 100 | Chris | 3 |
+------+-------+---------+
คำอธิบาย
GROUP BY Id, Nameจัดกลุ่มแถวที่ Id และ Name เหมือนกันCOUNT(*)นับจำนวนแถวในแต่ละกลุ่มHAVING IdCount > 2กรองเฉพาะกลุ่มที่มีจำนวนมากกว่า 2
รูปแบบอื่นๆ ที่ใช้บ่อย
1. หาค่าที่ซ้ำอย่างน้อย 2 ครั้ง (Duplicate ทั่วไป)
SELECT Id, Name, COUNT(*) AS cnt
FROM DemoTable1467
GROUP BY Id, Name
HAVING cnt > 1;
2. หาเฉพาะ Id ที่ซ้ำ (ไม่สน Name)
SELECT Id, COUNT(*) AS cnt
FROM DemoTable1467
GROUP BY Id
HAVING cnt > 1;
3. แสดงรายละเอียดแถวที่ซ้ำทั้งหมด
SELECT t1.*
FROM DemoTable1467 t1
JOIN (
SELECT Id, Name
FROM DemoTable1467
GROUP BY Id, Name
HAVING COUNT(*) > 1
) t2 USING (Id, Name)
ORDER BY t1.Id, t1.Name;
หมายเหตุ
- คอลัมน์ใน SELECT ต้องอยู่ใน GROUP BY หรือเป็น Aggregate Function (MySQL strict mode)
- HAVING ใช้กรองหลัง GROUP BY แทน WHERE ที่กรองก่อน GROUP BY
- เพื่อประสิทธิภาพบนตารางใหญ่ ควรมี Index บนคอลัมน์ที่ GROUP BY