บทนำ
การหาค่าที่ปรากฏซ้ำเกินจำนวนที่กำหนด (เช่น มากกว่า 2 ครั้ง) ใช้ GROUP BY ร่วมกับ HAVING COUNT(*) > n
ตัวอย่างการสร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Subject VARCHAR(100)
-> );
Query OK, 0 rows affected (0.53 sec)
mysql> INSERT INTO DemoTable(Subject) VALUES('MySQL');
mysql> INSERT INTO DemoTable(Subject) VALUES('MongoDB');
mysql> INSERT INTO DemoTable(Subject) VALUES('MySQL');
mysql> INSERT INTO DemoTable(Subject) VALUES('Java');
mysql> INSERT INTO DemoTable(Subject) VALUES('SQL Server');
mysql> INSERT INTO DemoTable(Subject) VALUES('MongoDB');
mysql> INSERT INTO DemoTable(Subject) VALUES('MySQL');
แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable;
ผลลัพธ์
+----+------------+
| Id | Subject |
+----+------------+
| 1 | MySQL |
| 2 | MongoDB |
| 3 | MySQL |
| 4 | Java |
| 5 | SQL Server |
| 6 | MongoDB |
| 7 | MySQL |
+----+------------+
7 rows in set (0.00 sec)
คำสั่งหาค่าที่ซ้ำมากกว่า 2 ครั้ง
mysql> SELECT Subject, COUNT(Subject) AS Freq
-> FROM DemoTable
-> GROUP BY Subject
-> HAVING COUNT(Subject) > 2;
ผลลัพธ์
+---------+------+
| Subject | Freq |
+---------+------+
| MySQL | 3 |
+---------+------+
1 row in set (0.00 sec)
คำอธิบาย
GROUP BY Subject- จัดกลุ่มตาม SubjectCOUNT(Subject)- นับจำนวนในแต่ละกลุ่มHAVING COUNT(Subject) > 2- กรองเฉพาะกลุ่มที่มีมากกว่า 2- ต่างจาก WHERE: HAVING ใช้กรองหลัง GROUP BY, WHERE ใช้กรองก่อน GROUP BY
การประยุกต์ใช้
-- หาข้อมูลซ้ำทั้งหมด (ปรากฏมากกว่า 1 ครั้ง)
SELECT Subject, COUNT(*) AS Count
FROM DemoTable
GROUP BY Subject
HAVING COUNT(*) > 1;
-- หาและลบข้อมูลซ้ำ (เก็บแค่แถวแรก)
DELETE t1 FROM DemoTable t1
INNER JOIN DemoTable t2
WHERE t1.Id > t2.Id AND t1.Subject = t2.Subject;