Eu acho que o mais simples é realmente usar a amostragem ponderada do reservatório:
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
É um ótimo método que permite escolher M de N elementos onde a probabilidade de ser escolhido para cada elemento é proporcional ao seu peso. Funciona tão bem quando você quer apenas um elemento. O método é descrito em este artigo . Observe que eles escolhem os maiores valores de POW(RAND(), 1/peso), o que equivale a escolher os menores valores de -LOG(RAND())/peso.