Ich entschuldige mich, wenn dieses Thema zu dem Tod gemacht wurde, aber ich habe Schwierigkeiten mit der Auswahl einer zufälligen Zeile aus einer großen MySQL-Tabelle. Es ist eine Tabelle mit dem Namen photos
und der Primärschlüssel ist PhotoID
. Im Moment ist der ID-Bereich von ~ 1500 (aufgrund von Reihen, die beim Testen erstellt wurden, dann gelöscht) auf ~ 12000, mit einigen Lücken, und ich erwarte, dass er noch viel größer wird.MySQL - wahlfreie Zeile aus großer Tabelle
Während es ist schon relativ klein Ich habe mit:
SELECT PhotoID FROM photos
... in einen PHP-Array $All_IDs
, dann in PHP:
$RandomID = $All_IDs[mt_rand(0,count($All_IDs)-1)]
dann:
SELECT /* other columns */ FROM photos WHERE PhotoID = $RandomID
Das funktioniert gut, ich bekomme eine gute Auswahl an zufälligen Fotos, wenn ich es wiederhole. Allerdings denke ich nicht, dass es sehr effizient funktionieren wird, die gesamte PhotoID
Spalte zu laden, um eine zufällige ID auszuwählen, dann eine andere Abfrage, um diese Aufzeichnung zu erhalten, besonders wenn ich mehrere auswähle. Genauso würde ich lieber nicht die gesamte Tabelle (alle Spalten) in ein Array auswählen, nur um eines auszuwählen. Mit der Hilfe von einigen anderen Stackoverflow Antworten kam ich mit dem nach Abschluß:
SELECT MIN(PhotoID) INTO @MinID FROM photos;
SELECT MAX(PhotoID) INTO @MaxID FROM photos;
SELECT PhotoID,/* other columns */ FROM photos WHERE PhotoID >= (@MinID + RAND() * (@MaxID - @MinID)) ORDER BY PhotoID LIMIT 0,1
Ich dachte, das funktionieren würde, aber ich finde diese Abfrage mehrmals zu wiederholen nur mir eine kurze Spanne von IDs zu geben, in der 1500 - 1700 Bereich, wenn, wie oben, die IDs derzeit in Richtung 12.000 gehen. Ich kann nicht verstehen, warum das so ist?
Das ist ideal, danke ...Ich vermied 'ORDER BY RAND()', da ich wusste, dass 'RAND()' für jede Zeile aufgerufen würde, aber ich dachte, es würde nur einmal aufgerufen werden, wenn es Teil der 'WHERE'-Klausel wäre. Ich hätte auch nie daran gedacht, 'JOIN' zu verwenden. – Iain
HINWEIS: Dieser Ansatz ist nicht unbedingt der beste Ansatz zum Zurückgeben einer zufälligen Zeile aus einer Gruppe. Ich habe versucht, den Grund für das Verhalten zu erklären, das bei der ursprünglichen Abfrage beobachtet wurde, und ein Beispiel für das Implementieren des scheinbar beabsichtigten Entwurfs der ursprünglichen Abfrage. (Die Verwendung von JOIN funktioniert in diesem Fall, weil die Inline-Ansicht "r" eine einzelne Zeile zurückgibt.) Wenn aus irgendeinem Grund mehrere Anweisungen wie im Original verwendet werden müssen, verschieben Sie die RAND() -Operation in eine separate Anweisung und Übergeben Sie einen * einzigen * statischen Wert in die eigentliche Abfrage. Was macht die Abfrage in dieser Antwort? – spencer7593