Puedes hacer esto usando rand()
y luego usando una suma acumulativa. Asumiendo que suman 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;
Notas:
rand()
se llama una vez en una subconsulta para inicializar una variable. Múltiples llamadas arand()
no son deseables.- Existe una posibilidad remota de que el número aleatorio esté exactamente en el límite entre dos valores. El
limit 1
elige arbitrariamente 1. - Esto podría hacerse más eficiente deteniendo la subconsulta cuando
cumep > @r
. - Los valores no tienen que estar en ningún orden en particular.
- Esto se puede modificar para manejar las posibilidades en las que la suma no es igual a 1, pero esa sería otra cuestión.