un Forastero  <Webworking>


zufälliger Datensatz aus einer Datenbanktabelle

Samstag, 13 Februar 2010   

Die Überschrift könnte auch lauten: Warum man "ORDER BY RAND()" nicht nutzen sollte oder wie man einen zufälligen Datensatz aus einer Datenbanktabelle bekommt. Häufig wird eine Datenbank-Abfrage wie die Folgende verwendet, um einen zufälligen Datensatz aus einer Tabelle auszuwählen und anzuzeigen.


SELECT einfeld FROM dbtabelle ORDER BY RAND() LIMIT 1

Ist aber keine gute Idee, wenn man großen Tabellen hat. Für kleinere Tabellen mit 50-100 Datensätzen spielt es keine Rolle.

Verwendet man den oben angegebenen Query bei Tabellen mit 10000 Datensätzen, muss der Datenbankserver 10000 Zufallszahlen generieren, diese Zahlen nach der Niedrigsten scannen und ausgeben. Das Generieren von zufälligen Zahlen ist eine relative aufwendige Operation. Das Scannen, um die niedrigste Zahl zu finden ist ebenfalls nicht sehr schnell. Besonders wenn das Limit nicht 1 sondern zum Beispiel 10 ist. Je nachdem wie die Daten in der Tabelle vorliegen muss im Hintergrund eine temporäre Tabelle genutzt werden.

Bleibt also die Frage, wie man an einen zufälligen Datensatz kommt, ohne diese Prozedur zu bemühen. Letzlich benötigt man 2 Queries und ein kleines bischen PHP dazwischen.


SELECT COUNT(*) AS count FROM dbtabelle

// count wird in $dbcnt gespeichert
$dbcnt=$dbcnt-1;
// Zufallszahl zwischen 0 und $dbcnt
$generierte_zahl=rand(0, $dbcnt);

SELECT einfeld FROM dbtabelle LIMIT $generierte_zahl, 1

Gut, es braucht 2 Queries, diese sind aber bei weitem schneller als die zuallererst genannte Variante mit dem ORDER BY RAND() Query.





Kommentare

es gibt insgesamt 0 Kommentar(e)



Name*
Vorname
Kommentar*
Email
Homepage
Telefon
Sicherheitscode *
 


This is a nested column

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

This is another nested column

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.