Du kan gøre dette ved at bruge rand()
og derefter bruge en kumulativ sum. Forudsat at de tæller op til 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;
Bemærkninger:
rand()
kaldes én gang i en underforespørgsel for at initialisere en variabel. Flere kald tilrand()
er ikke ønskelige.- Der er en lille chance for, at det tilfældige tal vil være nøjagtigt på grænsen mellem to værdier.
limit 1
vælger vilkårligt 1. - Dette kunne gøres mere effektivt ved at stoppe underforespørgslen, når
cumep > @r
. - Værdierne behøver ikke at være i nogen bestemt rækkefølge.
- Dette kan ændres til at håndtere chancer, hvor summen ikke er lig med 1, men det ville være et andet spørgsmål.