Ich habe einen Datensatz mit Zeilen, die jeweils eine "Quoten"-Zahl zwischen 1 und 100 enthalten. Ich möchte dies auf möglichst effiziente Weise tun. Die Quoten addieren sich nicht unbedingt zu 100.
Ich habe ein paar Ideen gehabt.
a) Wählen Sie den gesamten Datensatz aus, addieren Sie dann alle Quoten und erzeugen Sie eine Zufallszahl zwischen 1 und dieser Zahl. Ziehen Sie dann in einer Schleife die Quoten von der Zahl ab, bis sie 0 ist.
Ich wollte die Auswirkungen auf die Datenbank so gering wie möglich halten und habe daher überlegt, ob ich nur die Zeilen auswählen sollte, die ich benötige.
b)
SELECT * FROM table WHERE (100*RAND()) < odds
Ich habe überlegt LIMIT 0,1
Aber wenn die Elemente die gleiche Wahrscheinlichkeit haben, wird nur eines von ihnen zurückgegeben
Alternativ kann man den gesamten Datensatz nehmen und einen Zufallswert daraus auswählen... aber dann werden die Quoten beeinflusst, da es ein Zufallswert mit Quoten und dann ein Zufallswert ohne Quoten wird, so dass die Quoten zugunsten der höheren Quoten geneigt werden (sogar noch mehr).
Ich denke, ich könnte order by odds
ASC nimmt dann den gesamten Datensatz und wählt dann mit PHP eine zufällige Zeile mit der gleichen Quote wie der erste Datensatz (die niedrigste) aus.
Das scheint mir eine ungeschickte Lösung zu sein.
Hat jemand eine bessere Lösung? Wenn nicht, welche der oben genannten Lösungen ist die beste?