การเตรียมข้อมูล
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
);