Vous pouvez le faire en utilisant rand()
puis en utilisant une somme cumulée. En supposant qu'ils totalisent 100 % :
select t.*
from (select t.*, (@cumep := @cumep + chance) as cumep
from t cross join
(select @cumep := 0, @r := rand()) params
) t
where @r between cumep - chance and cumep
limit 1;
Remarques :
rand()
est appelée une fois dans une sous-requête pour initialiser une variable. Plusieurs appels àrand()
ne sont pas souhaitables.- Il y a une faible chance que le nombre aléatoire soit exactement à la frontière entre deux valeurs. La
limit 1
choisit arbitrairement 1. - Cela pourrait être rendu plus efficace en arrêtant la sous-requête lorsque
cumep > @r
. - Les valeurs ne doivent pas nécessairement être dans un ordre particulier.
- Cela peut être modifié pour gérer les chances où la somme n'est pas égale à 1, mais ce serait une autre question.