การ DELETE หลายแถวพร้อมกันด้วย Self-JOIN
ใช้ DELETE ... FROM table JOIN table alias ON condition เพื่อลบแถวที่ตรงเงื่อนไขการ Join (มักใช้ลบ Duplicates หรือข้อมูลที่เกี่ยวข้อง)
Syntax
DELETE t1 FROM table_name t1 JOIN table_name t2 ON t1.column = t2.column WHERE t2.column = 'value';
ตัวอย่าง: ลบแถวที่ FirstName = 'Bob' ทั้งหมด
สร้างตารางและเพิ่มข้อมูล (มี Bob 3 คน):
mysql> CREATE TABLE DemoTable (Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, FirstName VARCHAR(100));
Query OK, 0 rows affected (0.69 sec)
mysql> INSERT INTO DemoTable (FirstName) VALUES
('Chris'), ('Bob'), ('Mike'), ('Adam'), ('Bob'), ('Adam'), ('Bob'), ('Mike');
Query OK, 8 rows affected
ข้อมูลทั้งหมด:
mysql> SELECT * FROM DemoTable;
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Bob | | 3 | Mike | | 4 | Adam | | 5 | Bob | | 6 | Adam | | 7 | Bob | | 8 | Mike | +----+-----------+ 8 rows in set (0.00 sec)
ลบแถวที่ FirstName = 'Bob' ด้วย Self-JOIN:
mysql> DELETE DemoTable FROM DemoTable JOIN DemoTable tbl ON DemoTable.FirstName = tbl.FirstName WHERE tbl.FirstName = 'Bob'; Query OK, 3 rows affected (0.15 sec)
ผลลัพธ์ - Bob ถูกลบทั้ง 3 แถว:
mysql> SELECT * FROM DemoTable;
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 3 | Mike | | 4 | Adam | | 6 | Adam | | 8 | Mike | +----+-----------+ 5 rows in set (0.00 sec)
วิธีอื่นที่ง่ายกว่า (สำหรับกรณีนี้)
-- ลบโดยตรงด้วย WHERE (ไม่ต้อง JOIN) DELETE FROM DemoTable WHERE FirstName = 'Bob';
เมื่อไหร่ควรใช้ JOIN DELETE
- ลบข้อมูลในตาราง A ตามเงื่อนไขในตาราง B (Cross-table Delete)
- ลบ Duplicates โดยเก็บแถวแรก/สุดท้าย (Complex)
- Cascade Delete แบบ Manual (ถ้าไม่ใช้ FK CASCADE)
ตัวอย่าง Cross-table Delete
DELETE orders FROM orders JOIN customers ON orders.customer_id = customers.id WHERE customers.status = 'banned';