Мисля, че най-простото всъщност е да се използва претегленото вземане на проби от резервоара:
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
Това е страхотен метод, който ви позволява да изберете M от N елемента, където вероятността да бъде избран за всеки елемент е пропорционална на теглото му. Работи също толкова добре, когато случайно искате само един елемент. Методът е описан в тази статия . Обърнете внимание, че те избират най-големите стойности на POW(RAND(), 1/тегло), което е еквивалентно на избора на най-малките стойности на -LOG(RAND()) / тегло.