Giới thiệu
Kết hợp ORDER BY ... DESC LIMIT 20 để lấy 20 bản ghi mới nhất, sau đó dùng ORDER BY RAND() LIMIT 5 để chọn 5 bản ghi ngẫu nhiên trong tập con đó.
Ví dụ thực hành
1. Tạo bảng DemoTable773
mysql> CREATE TABLE DemoTable773 (StudentId INT);
2. Chèn 23 bản ghi
mysql> INSERT INTO DemoTable773 VALUES (100),(200),(300),(400),(500),
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
(90),(91),(92),(93),(94),(95),(96),(97);
3. Truy vấn 5 bản ghi ngẫu nhiên từ 20 bản ghi cuối
mysql> SELECT * FROM (
SELECT * FROM DemoTable773 ORDER BY StudentId DESC LIMIT 20
) AS RANDOM_OUTPUT ORDER BY RAND() LIMIT 5;
4. Kết quả mẫu (ngẫu nhiên mỗi lần chạy)
+-----------+
| StudentId |
+-----------+
| 95 |
| 4 |
| 10 |
| 7 |
| 300 |
+-----------+
Giải thích
- Truy vấn con (subquery) sắp xếp giảm dần theo
StudentId(giả sử ID tăng dần theo thời gian) và lấy 20 hàng đầu. - Bảng dẫn xuất
RANDOM_OUTPUTsau đó được sắp xếp ngẫu nhiên bằngRAND()và lấy 5 hàng. - Cần alias cho bảng dẫn xuất (
AS RANDOM_OUTPUT) theo yêu cầu MySQL.
Lưu ý hiệu suất
ORDER BY RAND()chậm trên tập dữ liệu lớn do phải tạo bảng tạm và sắp xếp.- Với dữ liệu lớn, hãy xem xét: lấy ID max/min, sinh số ngẫu nhiên ở ứng dụng, hoặc dùng
TABLESAMPLE(MySQL 8.0+ không hỗ trợ, nhưng có thể mô phỏng). - Đảm bảo có index trên cột sắp xếp (
StudentId) để subquery nhanh.