Vấn đề: Xóa N hàng đầu tiên theo thứ tự ID
Cần xóa 3 hàng có Id nhỏ nhất trong bảng.
Giải pháp: DELETE với IN + Subquery (có LIMIT)
MySQL không cho phép LIMIT trực tiếp trong DELETE (trừ khi có ORDER BY trong một số phiên bản). Cách chuẩn: subquery chọn ID cần xóa.
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (Id INT, Name VARCHAR(20));
INSERT INTO DemoTable VALUES
(101, 'Chris'), (102, 'David'), (103, 'Mike'), (104, 'Bob'), (105, 'Sam');
2. Truy vấn xóa 3 hàng đầu (ID nhỏ nhất)
DELETE FROM DemoTable
WHERE Id IN (
SELECT * FROM (
SELECT Id FROM DemoTable ORDER BY Id LIMIT 3
) AS t
);
3. Giải thích
- Subquery trong nhất:
SELECT Id FROM DemoTable ORDER BY Id LIMIT 3– Lấy 3 ID nhỏ nhất (101,102,103). - Subquery giữa:
SELECT * FROM (...) AS t– Bọc lại thành bảng dẫn xuất (derived table). MySQL yêu cầu alias cho derived table. WHERE Id IN (...)– Xóa các hàng có ID trong tập kết quả.
4. Kết quả (còn lại 104, 105)
+------+------+
| Id | Name |
+------+------+
| 104 | Bob |
| 105 | Sam |
+------+
Cách hiện đại hơn (MySQL 8.0+): CTE
WITH to_delete AS (
SELECT Id FROM DemoTable ORDER BY Id LIMIT 3
)
DELETE FROM DemoTable WHERE Id IN (SELECT Id FROM to_delete);
Lưu ý
- Cấu trúc
SELECT * FROM (subquery) AS tbắt buộc trong MySQL khi subquery cóLIMITvà nằm trongIN. - Luôn test subquery riêng trước:
SELECT Id FROM DemoTable ORDER BY Id LIMIT 3. - Với bảng lớn, đảm bảo có index trên
IdđểORDER BY Id LIMIT 3nhanh.