Puoi farlo usando rand()
e quindi utilizzando una somma cumulativa. Supponendo che si sommino al 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;
Note:
rand()
viene chiamato una volta in una sottoquery per inizializzare una variabile. Più chiamate arand()
non sono desiderabili.- C'è una remota possibilità che il numero casuale sia esattamente sul confine tra due valori. Il
limit 1
sceglie arbitrariamente 1. - Questo potrebbe essere reso più efficiente interrompendo la sottoquery quando
cumep > @r
. - Non è necessario che i valori siano in un ordine particolare.
- Questo può essere modificato per gestire le possibilità in cui la somma non è uguale a 1, ma questa sarebbe un'altra domanda.