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

Lấy hàng ngẫu nhiên từ bảng MySQL với PREPARE STATEMENT

Để 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 - 1
  • ROUND(): 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ên
  • PREPARE/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ộ.