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

หาแถวที่มีค่า Column ซ้ำกันใน MySQL (Duplicate Values)

ใช้ 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 แทน