Можете да направите това с помощта на rand()
и след това се използва кумулативна сума. Ако приемем, че сумата им е до 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;
Бележки:
rand()
се извиква веднъж в подзаявка, за да инициализира променлива. Множество извиквания къмrand()
не са желателни.- Има малка вероятност произволното число да бъде точно на границата между две стойности.
limit 1
произволно избира 1. - Това може да стане по-ефективно чрез спиране на подзаявката, когато
cumep > @r
. - Стойностите не трябва да са в определен ред.
- Това може да бъде променено, за да се обработват шансове, при които сумата не е равна на 1, но това би било друг въпрос.