Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment sélectionner une ligne au hasard en tenant compte d'un poids ?

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.