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

Sắp xếp ngẫu nhiên và lấy hàng ngẫu nhiên với ORDER BY RAND() trong MySQL

Giới thiệu

Sử dụng ORDER BY RAND() để xáo trộn thứ tự hàng, kết hợp LIMIT để lấy mẫu ngẫu nhiên.

1. Cú pháp chung

select * from DemoTable1559 
where yourColumnName IN(yourValue1, yourValue2, ....N) 
order by rand() 
limit yourLimitValue;

2. Tạo bảng và dữ liệu

mysql> create table DemoTable1559 (
    -> EmployeeId int,
    -> EmployeeName varchar(20),
    -> EmployeeAge int
    -> ); 
Query OK, 0 rows affected (1.22 sec)

mysql> insert into DemoTable1559 values(101,'Bob',28); 
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1559 values(102,'Robert',26); 
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1559 values(103,'Sam',25); 
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1559 values(104,'Mike',29); 
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1559 values(105,'John',34); 
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1559 values(106,'Carol',31); 
Query OK, 1 row affected (0.19 sec)

3. Dữ liệu gốc

mysql> select * from DemoTable1559;
+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
|        101 | Bob          |          28 |
|        102 | Robert       |          26 |
|        103 | Sam          |          25 |
|        104 | Mike         |          29 |
|        105 | John         |          34 |
|        106 | Carol        |          31 |
+------------+--------------+-------------+
6 rows in set (0.00 sec)

4. Lấy 3 hàng ngẫu nhiên từ danh sách ID cho trước

mysql> select * from DemoTable1559 
    -> where EmployeeId IN(101,103,106) 
    -> order by rand() limit 3;

5. Kết quả (mỗi lần chạy khác nhau)

+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
|        101 | Bob          |          28 |
|        103 | Sam          |          25 |
|        106 | Carol        |          31 |
+------------+--------------+-------------+
3 rows in set (0.00 sec)

Hiệu suất: ORDER BY RAND() chậm trên bảng lớn (phải tạo bảng tạm, sắp xếp toàn bộ). Với bảng lớn, dùng:

-- Cách 1: Lấy ID ngẫu nhiên trước
SELECT * FROM table WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM table))) LIMIT 1;

-- Cách 2: TABLESAMPLE (MySQL 8.0.24+)
SELECT * FROM table TABLESAMPLE SYSTEM(10); -- 10% dữ liệu