Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Sắp xếp ngẫu nhiên trong MySQL với cột giá trị random

Để 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 tbl có cột RandomRecord.
  • ORDER BY RandomRecord DESC sắ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.