Jeg tror, at det enkleste faktisk er at bruge den vægtede reservoirprøvetagning:
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
Det er en fantastisk metode, der lader dig vælge M ud af N elementer, hvor sandsynligheden for at blive valgt for hvert element er proportional med dets vægt. Det fungerer lige så godt, når du tilfældigvis kun vil have ét element. Metoden er beskrevet i denne artikel . Bemærk, at de vælger de største værdier af POW(RAND(), 1/vægt), hvilket svarer til at vælge de mindste værdier af -LOG(RAND()) / vægt.