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

ค้นหาค่าที่ซ้ำกันใน MySQL ด้วย GROUP BY HAVING


หลักการค้นหาข้อมูลซ้ำ

ใช้ 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 เพื่อดูค่าที่ซ้ำมากที่สุดก่อน