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

Chọn bản ghi ngẫu nhiên từ cơ sở dữ liệu MySQL


Giới thiệu

Để lấy một bản ghi ngẫu nhiên từ bảng, MySQL cung cấp hàm RAND() kết hợp với ORDER BY và LIMIT 1.

Cú pháp

SELECT * FROM table_name ORDER BY RAND() LIMIT 1;

Ví dụ minh họa

Tạo bảng và chèn dữ liệu

mysql> CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ClientName VARCHAR(100),
    ClientAge INT
);
mysql> INSERT INTO DemoTable (ClientName, ClientAge) VALUES 
('Robert', 45), ('Mike', 55), ('Bob', 42), ('Sam', 47);

Truy vấn lấy bản ghi ngẫu nhiên

mysql> SELECT * FROM DemoTable ORDER BY RAND() LIMIT 1;

Kết quả (ví dụ)

+----+------------+-----------+
| Id | ClientName | ClientAge |
+----+------------+-----------+
| 3  | Bob        | 42        |
+----+------------+-----------+

Kết quả sẽ khác nhau mỗi lần chạy.

⚠️ Cảnh báo hiệu năng

ORDER BY RAND() rất chậm trên bảng lớn vì MySQL phải tạo số ngẫu nhiên cho mọi dòng, sắp xếp toàn bộ bảng rồi mới lấy 1 dòng.

Các giải pháp thay thế cho bảng lớn

Cách 1: Lấy ID ngẫu nhiên trong phạm vi (cần ID liên tục)

SELECT * FROM DemoTable 
WHERE Id >= (SELECT FLOOR(RAND() * (SELECT MAX(Id) FROM DemoTable))) 
ORDER BY Id LIMIT 1;

Cách 2: Sử dụng OFFSET ngẫu nhiên (cần biết tổng số dòng)

SET @total = (SELECT COUNT(*) FROM DemoTable);
SET @offset = FLOOR(RAND() * @total);
PREPARE stmt FROM 'SELECT * FROM DemoTable LIMIT ?, 1';
EXECUTE stmt USING @offset;

Cách 3: Bảng nhỏ - dùng TABLESAMPLE (MySQL 8.0+)

SELECT * FROM DemoTable TABLESAMPLE SYSTEM (1) LIMIT 1;

Lưu ý: TABLESAMPLE lấy mẫu theo trang dữ liệu, không đảm bảo ngẫu nhiên tuyệt đối mỗi dòng.