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

หาค่าซ้ำในคอลัมน์ MySQL ด้วย GROUP BY HAVING

การเตรียมข้อมูล

mysql> CREATE TABLE DemoTable1858 (ModelNumber VARCHAR(50));

mysql> INSERT INTO DemoTable1858 VALUES
    ('Audi A4'), ('Audi A6'), ('Audi A4'), ('Audi Q5'), ('Audi R8'), ('Audi Q5');

ข้อมูลในตาราง

+-------------+
| ModelNumber |
+-------------+
| Audi A4     |
| Audi A6     |
| Audi A4     |
| Audi Q5     |
| Audi R8     |
| Audi Q5     |
+-------------+

หาค่าที่ซ้ำ (Count >= 2)

mysql> SELECT ModelNumber FROM DemoTable1858
    GROUP BY ModelNumber
    HAVING COUNT(ModelNumber) >= 2;

ผลลัพธ์:

+-------------+
| ModelNumber |
+-------------+
| Audi A4     |
| Audi Q5     |
+-------------+

การทำงานของ HAVING

  • GROUP BY จับกลุ่มค่าเหมือนกัน
  • COUNT(*) นับจำนวนในแต่ละกลุ่ม
  • HAVING กรองกลุ่มหลัง Aggregate (ต่างจาก WHERE ที่กรองก่อน Group)

ขยาย: แสดงจำนวนครั้งที่ซ้ำ

SELECT ModelNumber, COUNT(*) AS cnt
FROM DemoTable1858
GROUP BY ModelNumber
HAVING COUNT(*) > 1
ORDER BY cnt DESC;

หาแถวทั้งหมดที่เป็น Duplicate (รวมแถวแรกด้วย)

SELECT * FROM DemoTable1858
WHERE ModelNumber IN (
    SELECT ModelNumber FROM DemoTable1858
    GROUP BY ModelNumber HAVING COUNT(*) > 1
);

ลบ Duplicate (เก็บแถวแรก)

-- ต้องมี Primary Key/Unique Column
DELETE t1 FROM DemoTable1858 t1
JOIN DemoTable1858 t2
  ON t1.ModelNumber = t2.ModelNumber AND t1.Id > t2.Id;
-- หรือ MySQL 8.0+ ใช้ ROW_NUMBER()
DELETE FROM DemoTable1858
WHERE Id NOT IN (
    SELECT Id FROM (
        SELECT Id, ROW_NUMBER() OVER (PARTITION BY ModelNumber ORDER BY Id) AS rn
        FROM DemoTable1858
    ) t WHERE rn = 1
);