Sie können dies tun, indem Sie rand()
verwenden und dann mit einer kumulativen Summe. Angenommen, sie ergeben zusammen 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;
Hinweise:
rand()
wird einmal in einer Unterabfrage aufgerufen, um eine Variable zu initialisieren. Mehrere Aufrufe vonrand()
sind nicht erwünscht.- Es besteht eine geringe Wahrscheinlichkeit, dass die Zufallszahl genau auf der Grenze zwischen zwei Werten liegt. Das
limit 1
wählt willkürlich 1. - Dies könnte effizienter gemacht werden, indem die Unterabfrage gestoppt wird, wenn
cumep > @r
. - Die Werte müssen keine bestimmte Reihenfolge haben.
- Dies kann geändert werden, um Chancen zu behandeln, bei denen die Summe nicht gleich 1 ist, aber das wäre eine andere Frage.