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

MySQL SELECT จาก Subquery แล้ว DELETE: หลีกเลี่ยง Error 1093

ใช้ 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)

คำอธิบายโครงสร้าง

  1. Subquery ชั้นใน: select Id from DemoTable1947 order by Id limit 3 → ได้ ID 101,102,103
  2. Subquery ชั้นกลาง: select * from (...) as t → สร้าง Derived Table ชั่วคราว (alias t)
  3. คิวรีหลัก: 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 ด้วย