Giới thiệu
Sử dụng ORDER BY RAND() để trả về các hàng theo thứ tự ngẫu nhiên mỗi lần truy vấn.
1. Tạo bảng và dữ liệu
mysql> create table DemoTable1557 (
-> SubjectId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> SubjectName varchar(20)
-> );
Query OK, 0 rows affected (0.91 sec)
mysql> insert into DemoTable1557(SubjectName) values('MySQL');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1557(SubjectName) values('MongoDB');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1557(SubjectName) values('Java');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1557(SubjectName) values('C');
Query OK, 1 row affected (0.13 sec)
2. Dữ liệu gốc (theo ID)
mysql> select * from DemoTable1557;
+-----------+-------------+ | SubjectId | SubjectName | +-----------+-------------+ | 1 | MySQL | | 2 | MongoDB | | 3 | Java | | 4 | C | +-----------+-------------+ 4 rows in set (0.00 sec)
3. Xáo trộn thứ tự
mysql> select * from DemoTable1557 order by rand();
4. Kết quả (ví dụ một lần chạy)
+-----------+-------------+ | SubjectId | SubjectName | +-----------+-------------+ | 1 | MySQL | | 3 | Java | | 2 | MongoDB | | 4 | C | +-----------+-------------+ 4 rows in set (0.00 sec)
Ứng dụng: Hiển thị quảng cáo ngẫu nhiên, quiz câu hỏi trắc nghiệm, A/B testing.
⚠️ Cảnh báo hiệu suất: ORDER BY RAND() yêu cầu MySQL tạo bảng tạm, gán số ngẫu nhiên cho mỗi hàng, sắp xếp → O(N log N). Rất chậm trên bảng > 10.000 hàng.
Giải pháp thay thế cho bảng lớn:
-- Lấy 1 hàng ngẫu nhiên nhanh SELECT * FROM table WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM table))) LIMIT 1; -- Lấy N hàng (có thể không đều) SELECT * FROM table WHERE RAND() < 0.01 -- 1% xác suất LIMIT 10;