Cập nhật dữ liệu dựa trên kết quả truy vấn con (Subquery) trong MySQL
Sử dụng subquery trong mệnh đề WHERE của UPDATE để xác định bản ghi cần cập nhật động.
Tạo bảng và dữ liệu
mysql> create table DemoTable ( Id int, Name varchar(20) ); mysql> insert into DemoTable values(100,'Chris'); mysql> insert into DemoTable values(250,'David'); mysql> insert into DemoTable values(150,'Mike');
Cập nhật: Đổi tên bản ghi có Id lớn nhất thành 'Robert'
mysql> update DemoTable
-> set Name='Robert'
-> where Id in (
-> select * from ( select max(Id) from DemoTable ) tbl1
-> );
Query OK, 1 row affected (0.27 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Kết quả
+------+--------+ | Id | Name | +------+--------+ | 100 | Chris | | 250 | Robert | | 150 | Mike | +------+--------+
Giải thích kỹ thuật:
- Subquery
select max(Id) from DemoTabletrả về 250 - Bọc thêm
select * from (...) tbl1để tránh lỗi "You can't specify target table 'DemoTable' for update in FROM clause" (MySQL không cho phép UPDATE bảng đồng thời SELECT từ bảng đó trong cùng một truy vấn trừ khi dùng derived table) INhoạt động với kết quả đơn giá trị như một tập hợp 1 phần tử
Cách viết gọn hơn (MySQL 8.0+ CTE):
WITH max_id AS (SELECT MAX(Id) as id FROM DemoTable) UPDATE DemoTable SET Name='Robert' WHERE Id = (SELECT id FROM max_id);