Ich denke, am einfachsten ist es tatsächlich, die gewichtete Reservoir-Probenahme zu verwenden:
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
Es ist eine großartige Methode, mit der Sie M aus N Elementen auswählen können, wobei die Wahrscheinlichkeit, für jedes Element ausgewählt zu werden, proportional zu seinem Gewicht ist. Es funktioniert genauso gut, wenn man zufällig nur ein Element haben möchte. Die Methode ist beschrieben in diesen Artikel . Beachten Sie, dass sie die größten Werte von POW(RAND(), 1/weight) auswählen, was der Auswahl der kleinsten Werte von -LOG(RAND()) / weight entspricht.