Выполните накопительную сумму, а затем выполните rand()
один раз:
select t.event
from (select t.*, (@cume_p = @cume_p + p) as cume_p
from t cross join
(select @cume_p := 0, @rand = rand()) params
) t
where @rand >= cume_p - p and
@rand < cume_p;
Обратите внимание, что rand()
вызывается ровно один раз.Значение хранится в переменной;это произвольный выбор.Это также может быть в подзапросе:
select t.event
from (select t.*, (@cume_p = @cume_p + p) as cume_p
from t cross join
(select @cume_p := 0) params
) t cross join
(select rand() as r) r
where r.r >= cume_p - p and
r.r < cume_p;