Tôi nghĩ đơn giản nhất thực sự là sử dụng lấy mẫu hồ chứa có trọng số:
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
Đó là một phương pháp tuyệt vời cho phép bạn chọn M trong số N phần tử trong đó xác suất được chọn cho mỗi phần tử tỷ lệ với trọng lượng của nó. Nó hoạt động tốt khi bạn chỉ muốn một phần tử. Phương thức được mô tả trong bài viết này . Lưu ý rằng họ chọn các giá trị lớn nhất của POW (RAND (), 1 / weight), tương đương với việc chọn các giá trị nhỏ nhất của -LOG (RAND ()) / weight.