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

MySQL: หาแถวที่มีค่าซ้ำกันในคอลัมน์เดียวกัน (Duplicate Values) ด้วย GROUP BY HAVING

วัตถุประสงค์

ค้นหาค่าในคอลัมน์ที่ปรากฏซ้ำเกินจำนวนที่กำหนด (เช่น มากกว่า 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