Archiv verlassen und diese Seite im Standarddesign anzeigen : MYSQ und PHP random
Deniz1982 09-02-2009, 00:00 Hi,
ich denke so ein Thread wurde hier entweder schon besprochen oder es nervt euch nur noch *g.
Also jetzt schon mal sorry aber erschlagt mich nicht gleich ;)
Nun das Mysql nicht vernünftig zufällige Datenstäze wählen kann wissen wir. Schade eigentlich.
Ich habe mir folgendes überlegt: Alle id´s aus einer bestimmten Tabelle zu ziehen um sie dann in einen array zu speichern.
PHP bringt ja schon von haus aus eine Funktion mit, die zufällige Werte aus einem Array holt.
Das Problem ist jedoch, was ist wenn ich mmm sagen wir mal so 100000 Datensätze habe ?
Ich denke da an Performance.
Gibt es eine Allternative ?
Original geschrieben von Deniz1982
Das Problem ist jedoch, was ist wenn ich mmm sagen wir mal so 100000 Datensätze habe ?
Du mußt die Werte ja nicht alle einlesen. Es reicht ein SELECT * FROM tabelle LIMIT n,1 (n= Zufallszahl zwischen 1 und 1000000)
Deniz1982 09-02-2009, 00:14 mmm klappt das auch, wenn nicht die ids Lückenhaft sind ? Zwischen durch löscht man ja auch mal was.
Die Anzahl der Datensätze bekommt man ja leicht mit Count raus. Aus dieser Zahl dann einen raussuchen und so den Limit setzten ? Meinst du das so ?
Gruss
Original geschrieben von Deniz1982
Nun das Mysql nicht vernünftig zufällige Datenstäze wählen kann wissen wir.
Wissen wir? RAND()?!
Deniz1982 09-02-2009, 00:16 Original geschrieben von lennart
Wissen wir? RAND()?!
Schonmal Rand() ausprobiert ? Irgendwann erkennst du, dass bestimmte Datensätze sich ziemlich oft wiederholen. Auch wenn du die Werte setzt.
mmm klappt das auch, wenn nicht die ids Lückenhaft sind ? Zwischen durch löscht man ja auch mal was.
Genau deswegen ja nicht ID = sondern LIMIT. LIMIT holt den x-ten Datensatz, egal was seine ID ist.
Deniz1982 09-02-2009, 00:19 Ich werd es mal testen wenn es klappt dann bin ich glücklich.
Falls es klappt, werde ich hier natürlich die Lösung Posten. Für andere ;)
Original geschrieben von Deniz1982
Schonmal Rand() ausprobiert ? Irgendwann erkennst du, dass bestimmte Datensätze sich ziemlich oft wiederholen. Auch wenn du die Werte setzt.
Zufall heißt ja nicht "keine Wiederholungen". Eine Liste mit 10 zufälligen Zahlen kann auch zehnmal die selbe Zahl beinhalten. Siehe dazu: http://de.wikipedia.org/wiki/Gesetz_der_gro%C3%9Fen_Zahlen
Deniz1982 09-02-2009, 00:36 Hey du hast absolut recht. Aber wenn ich 10000 Datenstäze habe und seltsamerweise immer wieder die
gleichen Datenstäte ziemlich oft dabei sind, dann arbeitet MYSQL nicht mit "Gesetz der großen Zahlen".
Im Klartext, wir können hier nicht mehr von Zufall sprechen, wenn von 10000 Datensätze und 100 Versuchen 80 mal der gleiche Datensatz auftaucht.
Original geschrieben von Deniz1982
Aber wenn ich 10000 Datenstäze habe und seltsamerweise immer wieder die
gleichen Datenstäte ziemlich oft dabei sind, dann arbeitet MYSQL nicht mit "Gesetz der großen Zahlen".
Im Klartext, wir können hier nicht mehr von Zufall sprechen, wenn von 10000 Datensätze und 100 Versuchen 80 mal der gleiche Datensatz auftaucht.
Eben doch! Lies doch mal den Wikieintrag. Da ist das doch sehr anschaulich erklärt.
Hast du nen ausreichend starken Seed mitgegeben? Ich hatte dann eigentlich noch nie größere Probleme.
PHP-Desaster 09-02-2009, 01:12 Alternativ alle IDs in eine Extratabelle schreiben, einen Datensatz über LIMIT n, 1 selektieren und herauslöschen. Ist die Tabelle leer, IDs neu einfügen. So hast du einen Zufall ohne Wiederholung.
frodenius 09-02-2009, 17:25 das entspricht einer permutation der reihenfolge.
wenn man diese permutation speichert muss man die elemente nur hintereinander lesen. und nicht immer löschen.
ist man am ende angekommen, einfach eine neue permutation bauen.
PHP-Desaster 09-02-2009, 20:05 Ja, entweder du stellt vorher eine zufällige Reihenfolge her und ließt auch in dieser Reihenfolge die Werte aus, oder du pickst dir halt jedesmal einen zufälligen Wert heraus und verwirfst ihn. Kommt im Endeffekt auf das gleiche heraus, nur musst du dir bei ersterem irgendwie die aktuelle Position merken und bei dem zweiten den Löschvorgang mit vornehmen.
|