Můžete to udělat pomocí rand()
a poté pomocí kumulativního součtu. Za předpokladu, že jejich součet dosáhne 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;
Poznámky:
rand()
je volána jednou v poddotazu k inicializaci proměnné. Vícenásobná volánírand()
nejsou žádoucí.- Existuje malá pravděpodobnost, že náhodné číslo bude přesně na hranici mezi dvěma hodnotami.
limit 1
libovolně zvolí 1. - To by se dalo zefektivnit zastavením dílčího dotazu při
cumep > @r
. - Hodnoty nemusí být v žádném konkrétním pořadí.
- To lze upravit tak, aby zpracovávalo šance, kde součet není roven 1, ale to by byla jiná otázka.