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