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.