Cách đơn giản nhất để lựa chọn những bản ghi(record) 1 cách ngẫu nhiên trong 1 bảng(table) trong Mysql là sử dụng “ORDER BY RAND()” trong câu truy vấn.
Có 1 số giải pháp như sau:
1. Giải pháp 1:
[SQL]
SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;
Vấn đề với câu truy vấn này là rất chậm. Lý do là Mysql phải tạo 1 bảng tạm với tất cả kết quả và gán cho mỗi bản ghi một chỉ số thứ tự ngẫu nhiên. Sau đó kết quả được sắp xếp và trả về kết quả.
Có 1 vài vấn đề về tốc độ truy vấn. Ý tưởng cơ bản là để lấy 1 số ngẫu nhiên và rồi lựa chọn 1 bản ghi cụ thể sử dụng số này.
Trong trường hợp tất cả các bản ghi có id duy nhất chúng ta sẽ phải nhặt 1 số ngẫu nhiên giữa id nhỏ nhất và lớn nhất rồi lựa chọn 1 bản ghi với id bằng số đó. Để làm truy vấn này chúng ta sẽ dùng toán tử >= thay vì = trong câu truy vấn cuối cùng.
Để lấy được id nhỏ nhất và lớn trong toàn bộ bảng chúng ta sẽ dùng hàm MAX() và MIN() . Những hàm này sẽ trả về giá trị nhỏ nhất và lớn nhất trong 1 nhóm cụ thể. Nhóm này trong trường hợp của chúng ta sẽ là tất cả các giá trị của cột`id` trong bảng.
- 2. Giải pháp 2:
- [PHP]
$range_result = mysql_query( " SELECT MAX(`id`) AS max_id , MIN(`id`) AS min_id FROM `table` ");
$range_row = mysql_fetch_object( $range_result );
$random = mt_rand( $range_row->min_id , $range_row->max_id );
$result = mysql_query( " SELECT * FROM `table` WHERE `id` >= $random LIMIT 0,1 ");
Như chúng ta đã đề cập đến cách này là giới hạn bảng dữ liệu với id duy nhất cho mỗi bản ghi. Chúng ta sẽ làm gì nếu nó không đc như vậy?
Giải pháp là dùng Mysql LIMIT. LIMIT chấp nhận 2 tham số (start, limit). Tham số start chỉ phần của bản ghi đầu tiên trả về, và limit là số lợng tối đa bản ghi trả về. Mặc định tham số đầu là 0 (không phải 1).
Để tính start chúng ta sẽ sinh ra 1 số ngẫu nhiên giữa 0 và 1 dùng hàm Mysql’s RAND(). Rồi chúng ta sẽ nhân số này với số lượng bản ghi trong bản được tính bẳng hàm COUNT(). Vì tham số LIMIT phải là số nguyên ko phải thực chúng ta sẽ làm tròn kết quả dùng hàm FLOOR(). Đoạn code kết quả sẽ như sau:
- 3. Giải pháp 3:
- [PHP]
$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` ");
$offset_row = mysql_fetch_object( $offset_result );
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `table` LIMIT $offset, 1 " );
Trong phiên bản MySQL4.1 hoặc mới hơn chúng ta có thể kết hợp cả 2 phương thức 2,3 bằng cách dùng truy vấn con (subquery) như sau:
- 4. Giải pháp 4:
- [SQL]
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
Giải pháp này giống giải pháp 2 ở chỗ chỉ dùng cho bảng có các bản ghi có id duy nhất.
Hãy nhớ chúng ta tìm kiếm những phương thức khác nhau cho việc lựa chọn bản ghi ngẫu nhiên là vì Tốc độ (Speed). Chúng ta sẽ đánh giá chúng dựa trên thời gian thực thi. Chúng ta sẽ không đi chi tiết vào phần cứng hay phần mềm gì. Kết quả tương đối như sau:
- Giải pháp 1: Chậm nhất, có thể nói nó dùng 100% thời gian để thực thi.
- Giải pháp 2: Mất 79%.
- Giải pháp 3: Mất 13%.
- Giải pháp 3: Mất 16%.
Vậy giải pháp tốt nhất là 3.
Theo akinas.com.

Thế lấy random từ MYSQL 1 lúc nhiều records thì sao nhỉ? Ví dụ 5 chứ không phải 1?
Để Limit 0,5 bạn à
Cảm ơn Admin rất nhiều!