Để sắp xếp ngẫu nhiên và hiển thị giá trị random dùng cho sắp xếp, tạo cột derived bằng RAND() trong subquery/CTE.
Ví dụ minh họa
Tạo bảng 6 sinh viên:
CREATE TABLE DemoTable (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(20)
);
INSERT INTO DemoTable (StudentName) VALUES
('Larry'), ('Sam'), ('Mike'), ('Carol'), ('Robert'), ('Chris');
Dữ liệu gốc:
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Larry | | 2 | Sam | | 3 | Mike | | 4 | Carol | | 5 | Robert | | 6 | Chris | +-----------+-------------+
Tạo cột random và sắp xếp giảm dần:
SELECT * FROM (
SELECT StudentName, RAND() + 1 AS RandomRecord FROM DemoTable
) AS tbl
ORDER BY RandomRecord DESC;
Kết quả (ví dụ):
+-------------+--------------------+ | StudentName | RandomRecord | +-------------+--------------------+ | Carol | 1.8973721451101566 | | Chris | 1.7821308670399065 | | Mike | 1.4640037673190271 | | Larry | 1.4134691557041081 | | Sam | 1.1408822407395414 | | Robert | 1.0948494543273461 | +-------------+--------------------+
Giải thích:
RAND()sinh số thực [0,1). Cộng 1 để ra [1,2) cho dễ đọc.- Subquery tạo derived table
tblcó cộtRandomRecord. ORDER BY RandomRecord DESCsắp xếp theo cột random này.
Cách đơn giản hơn (chỉ cần random thứ tự):
SELECT * FROM DemoTable ORDER BY RAND();
Lưu ý hiệu năng: ORDER BY RAND() quét toàn bảng, tạo file sort tạm, rất chậm trên bảng lớn (>10k hàng). Giải pháp thay thế: lấy MAX(Id), sinh random ID trong ứng dụng, WHERE Id >= random_id LIMIT 1.