หลักการค้นหาข้อมูลซ้ำ
ใช้ GROUP BY รวมค่าที่เหมือนกัน แล้วใช้ HAVING COUNT(*) > 1 กรองเฉพาะกลุ่มที่มีจำนวนมากกว่า 1 แถว
รูปแบบคำสั่ง
SELECT column_name, COUNT(*) as count FROM table_name GROUP BY column_name HAVING COUNT(*) > 1;
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable (
-> Value INT
-> );
Query OK, 0 rows affected (0.47 sec)
2. เพิ่มข้อมูล (มีค่าซ้ำ)
mysql> INSERT INTO DemoTable VALUES(20); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO DemoTable VALUES(10); Query OK, 1 row affected (0.08 sec) mysql> INSERT INTO DemoTable VALUES(30); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO DemoTable VALUES(10); -- ซ้ำ Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO DemoTable VALUES(30); -- ซ้ำ Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO DemoTable VALUES(40); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO DemoTable VALUES(50); Query OK, 1 row affected (0.27 sec)
3. แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable;
ผลลัพธ์:
+-------+ | Value | +-------+ | 20 | | 10 | | 30 | | 10 | | 30 | | 40 | | 50 | +-------+ 7 rows in set (0.00 sec)
4. ค้นหาค่าที่ซ้ำ (มีมากกว่า 1 ครั้ง)
mysql> SELECT * FROM DemoTable
-> GROUP BY Value
-> HAVING COUNT(*) > 1;
ผลลัพธ์:
+-------+ | Value | +-------+ | 10 | | 30 | +-------+ 2 rows in set (0.38 sec)
รูปแบบขยาย: แสดงจำนวนครั้งที่ซ้ำ
mysql> SELECT Value, COUNT(*) as Occurrences
-> FROM DemoTable
-> GROUP BY Value
-> HAVING COUNT(*) > 1;
ผลลัพธ์:
+-------+-------------+ | Value | Occurrences | +-------+-------------+ | 10 | 2 | | 30 | 2 | +-------+-------------+
กรณีการใช้งานจริง
- ตรวจสอบข้อมูลลูกค้าซ้ำ (Email, Phone, ID Card)
- หาสินค้าที่มีรหัสซ้ำในระบบ
- Audit log - หาการกระทำซ้ำที่ผิดปกติ
- Data cleaning ก่อน Import ข้อมูล
เคล็ดลับ
- ใช้ Index บนคอลัมน์ที่ GROUP BY เพื่อเพิ่มประสิทธิภาพ
- สำหรับคอลัมน์หลายคอลัมน์ ใช้
GROUP BY col1, col2 - รวมกับ
ORDER BY COUNT(*) DESCเพื่อดูค่าที่ซ้ำมากที่สุดก่อน