Je pense que le plus simple est en fait d'utiliser l'échantillonnage pondéré du réservoir :
SELECT
id,
-LOG(RAND()) / weight AS priority
FROM
your_table
ORDER BY priority
LIMIT 1;
C'est une excellente méthode qui vous permet de choisir M éléments sur N où la probabilité d'être choisi pour chaque élément est proportionnelle à son poids. Cela fonctionne aussi bien lorsque vous ne voulez qu'un seul élément. La méthode est décrite dans cet article . Notez qu'ils choisissent les plus grandes valeurs de POW(RAND(), 1/weight), ce qui équivaut à choisir les plus petites valeurs de -LOG(RAND()) / weight.