Jag tror att det enklaste faktiskt är att använda den viktade reservoarprovtagningen:
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
Det är en utmärkt metod som låter dig välja M av N element där sannolikheten att väljas för varje element är proportionell mot dess vikt. Det fungerar lika bra när du råkar bara ha ett element. Metoden beskrivs i denna artikel . Observera att de väljer de största värdena för POW(RAND(), 1/vikt), vilket motsvarar att välja de minsta värdena av -LOG(RAND()) / vikt.