Giải pháp: ORDER BY ... DESC LIMIT 1 trong UPDATE
MySQL cho phép ORDER BY và LIMIT trong câu lệnh UPDATE.
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (ID INT, GameScore INT); mysql> INSERT INTO DemoTable VALUES(15, 848747), (13, 909049), (34, 98474646), (31, 948474);
Dữ liệu gốc
+------+-----------+ | ID | GameScore | +------+-----------+ | 15 | 848747 | | 13 | 909049 | | 34 | 98474646 | <-- ID lớn nhất | 31 | 948474 | +------+-----------+
Truy vấn UPDATE
mysql> UPDATE DemoTable
-> SET GameScore = GameScore + 10
-> ORDER BY ID DESC
-> LIMIT 1;
Kết quả
+------+-----------+ | ID | GameScore | +------+-----------+ | 15 | 848747 | | 13 | 909049 | | 34 | 98474656 | <-- Đã +10 | 31 | 948474 | +------+-----------+
Giải thích
ORDER BY ID DESC: Sắp xếp ID giảm dần (lớn nhất lên đầu)LIMIT 1: Chỉ cập nhật 1 dòng đầu tiên sau sắp xếp- Kết hợp: Cập nhật dòng có ID lớn nhất
Các biến thể
| Mục tiêu | Cú pháp |
|---|---|
| ID nhỏ nhất | ORDER BY ID ASC LIMIT 1 |
| Score cao nhất | ORDER BY GameScore DESC LIMIT 1 |
| Score thấp nhất | ORDER BY GameScore ASC LIMIT 1 |
| Mới tạo gần nhất (AUTO_INCREMENT) | ORDER BY ID DESC LIMIT 1 |
⚠️ Lưu ý quan trọng
- Chỉ MySQL hỗ trợ ORDER BY/LIMIT trong UPDATE/DELETE (không chuẩn SQL)
- Không dùng được trong Prepared Statement (một số phiên bản)
- Replication: ORDER BY LIMIT có thể gây inconsistency giữa master-slave
- An toàn hơn: Dùng subquery
Cách chuẩn SQL (Portable)
UPDATE DemoTable SET GameScore = GameScore + 10 WHERE ID = (SELECT MAX(ID) FROM DemoTable);
So sánh
| Cách | Ưu điểm | Nhược điểm |
|---|---|---|
| ORDER BY LIMIT | 1 query, nhanh, MySQL native | Non-standard, replication risk |
| Subquery MAX() | Chuẩn SQL, an toàn replication | 2 truy vấn (subquery + update) |
| JOIN subquery | 1 query, chuẩn | Phức tạp hơn |
Khuyến nghị: Ứng dụng nội bộ MySQL → dùng ORDER BY LIMIT. Library/Framework portable → dùng subquery.