ใช้ GROUP BY ... HAVING COUNT(*) > 1 หาค่าที่ซ้ำ แล้ว IN หรือ JOIN กลับมาหาแถวทั้งหมด
สร้างตารางและข้อมูล (มีค่าซ้ำ)
mysql> CREATE TABLE RowValueDemo (Name VARCHAR(100));
mysql> INSERT INTO RowValueDemo VALUES
-> ('John'),('Bob'),('Carol'),('John'),('John'),('John'),('Bob'),('Bob');
ข้อมูลทั้งหมด:
+-------+ | Name | +-------+ | John | | Bob | | Carol | | John | | John | | John | | Bob | | Bob | +-------+
Query หาแถวที่มีค่า Name ซ้ำ
mysql> SELECT * FROM RowValueDemo
-> WHERE Name IN (
-> SELECT Name FROM RowValueDemo
-> GROUP BY Name HAVING COUNT(*) > 1
-> );
ผลลัพธ์ (7 แถว: John 4 ตัว, Bob 3 ตัว, Carol ไม่อยู่เพราะไม่ซ้ำ):
+------+ | Name | +------+ | John | | Bob | | John | | John | | John | | Bob | | Bob | +------+
วิธีอื่น: Window Function (MySQL 8.0+)
SELECT Name FROM (
SELECT Name, COUNT(*) OVER (PARTITION BY Name) AS cnt
FROM RowValueDemo
) t WHERE cnt > 1;
นับจำนวน Duplicate ต่อค่า
SELECT Name, COUNT(*) AS dup_count FROM RowValueDemo GROUP BY Name HAVING COUNT(*) > 1;
+------+-----------+ | Name | dup_count | +------+-----------+ | John | 4 | | Bob | 3 | +------+-----------+
Performance: IN Subquery อาจช้า ถ้าข้อมูลมาก ใช้ JOIN กับ Derived Table หรือ Window Function แทน