ใช้ Derived Table (Subquery ใน FROM clause มี alias) เพื่อเลือก ID ก่อน แล้ว DELETE ด้วย IN (...) หลีกเลี่ยง Error 1093
ตัวอย่างการใช้งาน
สร้างตารางและข้อมูล:
mysql> create table DemoTable1947 (Id int, Name varchar(20)); mysql> insert into DemoTable1947 values(101,'Chris'),(102,'David'),(103,'Mike'),(104,'Bob'),(105,'Sam');
ดูข้อมูล:
mysql> select * from DemoTable1947;
+------+-------+ | Id | Name | +------+-------+ | 101 | Chris | | 102 | David | | 103 | Mike | | 104 | Bob | | 105 | Sam | +------+-------+ 5 rows in set (0.00 sec)
คิวรี DELETE 3 แถวแรก (ORDER BY Id LIMIT 3)
mysql> delete from DemoTable1947
-> where Id IN (
-> select * from (
-> select Id from DemoTable1947 order by Id limit 3
-> ) as t
-> );
Query OK, 3 rows affected (0.00 sec)
ตรวจสอบผลลัพธ์ (เหลือ 104, 105):
mysql> select * from DemoTable1947;
+------+------+ | Id | Name | +------+------+ | 104 | Bob | | 105 | Sam | +------+------+ 2 rows in set (0.00 sec)
คำอธิบายโครงสร้าง
- Subquery ชั้นใน:
select Id from DemoTable1947 order by Id limit 3→ ได้ ID 101,102,103 - Subquery ชั้นกลาง:
select * from (...) as t→ สร้าง Derived Table ชั่วคราว (alias t) - คิวรีหลัก:
DELETE ... WHERE Id IN (...)→ อ้างอิง Derived Table ไม่ใช่ตารางต้นฉบับโดยตรง
วิธีอื่น (MySQL 8.0+ ใช้ CTE)
WITH to_delete AS ( SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3 ) DELETE FROM DemoTable1947 WHERE Id IN (SELECT Id FROM to_delete);
ประโยชน์: ลบเฉพาะ Top-N ตามเงื่อนไข ใช้ได้กับ UPDATE ด้วย