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 1wä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.