Myślę, że najprościej jest użyć próbkowania ważonego zbiornika:
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
To świetna metoda, która pozwala wybrać M z N elementów, gdzie prawdopodobieństwo wyboru każdego elementu jest proporcjonalne do jego wagi. Działa równie dobrze, gdy potrzebujesz tylko jednego elementu. Metoda jest opisana w ten artykuł . Zauważ, że wybierają największe wartości POW(RAND(), 1/waga), co jest równoznaczne z wybraniem najmniejszych wartości -LOG(RAND()) / waga.