Zufällige Auswahl und Reihenfolge in MySQL
Beim Abfragen einer MySQL-Datenbank möchte man häufig eine Teilmenge von Datensätzen zufällig auswählen. Hierzu kann die ORDER BY RAND()-Klausel verwendet werden. Es ist jedoch wichtig, die Reihenfolge der Operationen zu berücksichtigen, wenn Sie diese Klausel mit anderen Ordnungsklauseln kombinieren.
Eine häufige Gefahr tritt auf, wenn versucht wird, eine zufällige Teilmenge von Datensätzen auszuwählen und die resultierende Menge dann nach einer anderen Spalte zu sortieren. Die folgende Abfrage ist ein Beispiel hierfür:
SELECT * FROM users WHERE 1 ORDER BY RAND(), name ASC LIMIT 20
Die Absicht dieser Abfrage besteht darin, 20 zufällige Benutzer aus der Benutzertabelle auszuwählen und sie dann in aufsteigender Reihenfolge nach ihrer Namensspalte zu ordnen. Diese Abfrage führt jedoch nicht zum gewünschten Ergebnis.
Der Grund dafür ist, dass die ORDER BY RAND()-Klausel eine nicht deterministische Reihenfolge einführt. Dies bedeutet, dass sich die Reihenfolge der Ergebnisse jedes Mal ändert, wenn die Abfrage ausgeführt wird. Daher kann die nachfolgende Namens-ASC-Klausel nicht verwendet werden, um die Ergebnisse zuverlässig zu ordnen.
Um die Ergebnisse korrekt zu ordnen, müssen wir eine Unterabfrage verwenden. Die folgende Abfrage wählt 20 zufällige Benutzer aus und sortiert sie dann nach ihrer Namensspalte:
SELECT * FROM ( SELECT * FROM users ORDER BY RAND() LIMIT 20 ) T1 ORDER BY name
Die innere Abfrage wählt 20 Benutzer nach dem Zufallsprinzip aus und speichert das Ergebnis in der temporären Tabelle T1. Die äußere Abfrage wählt dann alle Zeilen aus T1 aus und sortiert sie nach Namen.
Das obige ist der detaillierte Inhalt vonWie wähle ich eine zufällige Teilmenge aus und sortiere sie dann nach einer anderen Spalte in MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!