Để lấy một hàng ngẫu nhiên (random row) từ bảng MySQL, một cách hiệu quả là dùng PREPARE STATEMENT kết hợp biến session và RAND().
Ví dụ minh họa
Tạo bảng:
mysql> create table DemoTable(
FirstName varchar(100),
CountryName varchar(100)
);
Chèn dữ liệu:
mysql> insert into DemoTable values('Adam','US');
mysql> insert into DemoTable values('Chris','AUS');
mysql> insert into DemoTable values('Robert','UK');
Hiển thị dữ liệu:
mysql> select * from DemoTable;
Kết quả:
+-----------+-------------+ | FirstName | CountryName | +-----------+-------------+ | Adam | US | | Chris | AUS | | Robert | UK | +-----------+-------------+
Quy trình lấy 1 hàng ngẫu nhiên
mysql> set @value := ROUND((select count(*) from DemoTable) * rand());
mysql> set @query := CONCAT('select * from DemoTable LIMIT ', @value, ', 1');
mysql> prepare myStatement from @query;
mysql> execute myStatement;
mysql> deallocate prepare myStatement;
Kết quả ví dụ (ngẫu nhiên):
+-----------+-------------+ | FirstName | CountryName | +-----------+-------------+ | Chris | AUS | +-----------+-------------+
Giải thích:
COUNT(*) * RAND(): Sinh số ngẫu nhiên từ 0 đến số lượng hàng - 1ROUND(): Làm tròn thành số nguyên (offset)CONCAT('LIMIT ', @value, ', 1'): Tạo truy vấn động lấy 1 hàng tại offset ngẫu nhiênPREPARE/EXECUTE/DEALLOCATE: Thực thi truy vấn động
Cách đơn giản hơn (MySQL 8.0+): SELECT * FROM DemoTable ORDER BY RAND() LIMIT 1; - dễ đọc hơn nhưng chậm trên bảng lớn do phải sắp xếp toàn bộ.