Saya pikir yang paling sederhana sebenarnya menggunakan sampling reservoir tertimbang:
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
Ini adalah metode hebat yang memungkinkan Anda memilih M dari N elemen di mana probabilitas untuk dipilih untuk setiap elemen sebanding dengan bobotnya. Ini bekerja dengan baik ketika Anda hanya menginginkan satu elemen. Metode ini dijelaskan dalam artikel ini . Perhatikan bahwa mereka memilih nilai terbesar dari POW(RAND(), 1/weight), yang setara dengan memilih nilai terkecil dari -LOG(RAND()) / weight.