การค้นหาแถวที่มีค่าซ้ำในคอลัมน์เฉพาะ (Duplicate Values) ใน MySQL
ใช้ SELF JOIN เปรียบเทียบแถวในตารางเดียวกัน โดย Join บนคอลัมน์ที่ต้องการตรวจสอบ และกรอง ID ไม่เท่ากัน
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูล (Larry ซ้ำ):
mysql> create table DemoTable (UserId int, UserName varchar(20)); mysql> insert into DemoTable values(10,'John'); mysql> insert into DemoTable values(11,'Sam'); mysql> insert into DemoTable values(12,'Larry'); mysql> insert into DemoTable values(13,'David'); mysql> insert into DemoTable values(14,'Larry');
ข้อมูล:
+--------+----------+ | UserId | UserName | +--------+----------+ | 10 | John | | 11 | Sam | | 12 | Larry | | 13 | David | | 14 | Larry | +--------+----------+
คิวรีหาแถวที่ UserName ซ้ำ (Self Join):
mysql> SELECT DISTINCT tbl1.* FROM DemoTable tbl1
JOIN DemoTable tbl2 ON tbl2.UserId <> tbl1.UserId AND tbl2.UserName = tbl1.UserName;
+--------+----------+ | UserId | UserName | +--------+----------+ | 14 | Larry | | 12 | Larry | +--------+----------+
วิธีที่พบบ่อยกว่า (GROUP BY + HAVING):
SELECT UserName, COUNT(*) as cnt FROM DemoTable GROUP BY UserName HAVING COUNT(*) > 1;
คืนค่า: Larry | 2 (เฉพื่อชื่อที่ซ้ำ และจำนวน)
หาแถวทั้งหมดที่ซ้ำ (รวมแถวแรก):
SELECT * FROM DemoTable WHERE UserName IN (
SELECT UserName FROM DemoTable GROUP BY UserName HAVING COUNT(*) > 1
);
MySQL 8.0+ Window Function:
SELECT * FROM (
SELECT *, COUNT(*) OVER (PARTITION BY UserName) as cnt FROM DemoTable
) t WHERE cnt > 1;