Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

MySQL: SELECT từ subquery rồi DELETE (xóa 3 hàng đầu theo ID)

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 t bắt buộc trong MySQL khi subquery có LIMIT và nằm trong IN.
  • 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 3 nhanh.