Penso che il più semplice sia in realtà utilizzare il campionamento ponderato del serbatoio:
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
È un ottimo metodo che ti consente di scegliere M su N elementi in cui la probabilità di essere scelta per ciascun elemento è proporzionale al suo peso. Funziona altrettanto bene quando ti capita di volere un solo elemento. Il metodo è descritto in questo articolo . Nota che scelgono i valori più grandi di POW(RAND(), 1/peso), che equivale a scegliere i valori più piccoli di -LOG(RAND())/peso.