Możesz to zrobić za pomocą rand()
a następnie za pomocą sumy skumulowanej. Zakładając, że sumują się do 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;
Uwagi:
rand()
jest wywoływana raz w podzapytaniu, aby zainicjować zmienną. Wiele wywołańrand()
nie są pożądane.- Istnieje niewielka szansa, że liczba losowa będzie dokładnie na granicy dwóch wartości.
limit 1
arbitralnie wybiera 1. - Mogłoby to być bardziej wydajne przez zatrzymanie podzapytania, gdy
cumep > @r
. - Wartości nie muszą być w określonej kolejności.
- Można to zmodyfikować, aby poradzić sobie z szansami, w których suma nie jest równa 1, ale to byłoby inne pytanie.