ใช้ LEFT JOIN กับ Subquery ที่หา Id ต่ำสุดของแต่ละชื่อ แล้วลบแถวที่ไม่เข้ากลุ่ม (Id IS NULL)
สร้างตารางและเพิ่มข้อมูลซ้ำ
mysql> create table DemoTable (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(100) );
Query OK, 0 rows affected (0.46 sec)
mysql> insert into DemoTable(FirstName) values('Chris'); Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(FirstName) values('Robert'); Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(FirstName) values('Robert'); Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(FirstName) values('John'); Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(FirstName) values('John'); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(FirstName) values('Mike'); Query OK, 1 row affected (0.09 sec)
คิวรี DELETE ด้วย LEFT JOIN
mysql> delete tbl from DemoTable tbl
left join(
select min(Id) as Id, FirstName
from DemoTable
group by FirstName
) tbl1 ON tbl.Id = tbl1.Id AND tbl.FirstName = tbl1.FirstName
where tbl1.Id IS NULL;
Query OK, 2 rows affected (0.16 sec)
ผลลัพธ์: เหลือแถวแรกของแต่ละชื่อ
mysql> select * from DemoTable;
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Robert | | 4 | John | | 6 | Mike | +----+-----------+ 4 rows in set (0.00 sec)
ตรรกะ: Subquery หา Id น้อยสุด (min) ของแต่ละชื่อ → LEFT JOIN → แถวที่ไม่จับคู่ (tbl1.Id IS NULL) คือข้อมูลซ้ำ → ลบทิ้ง