Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
10.07.2002, 22:06
hausi



Grösseres Problem:
Ich habe in meiner DB eine Tabelle mit Bildern, von denen ich eigentlich n zufällig ausgewählte Bilder haben möchte. Nun gibts leider (soviel ich weiss) keine Möglichkeit, das direkt mit einem MySQL-Befehl zu machen und meine Variante ist zu komplex und zu langsam.
Bisher gehe ich folgendermassen vor:
Quellcode:
* Alle Bilder (id) auslesen
* Alle in einen Array speichern
* Per for-Schleife von 0 bis n-1
  * Zufallszahl von 0 bis count( array )
  * Inhalt von array[x] in einem zweiten Array speichern
* Per foreach durch den neuen Array loopen
  * Ausgabe vom Bild

Naja, das ganze wird noch dadurch erschwert, dass immer 3 Bilder in einer table row sein müssen und das ganze Script ca. 5000 mal pro Tag aufgerufen werden wird. Im Moment braucht nur dieser Teil ca. 0.8 Sekunden, was einfach viel zu langsam ist (das ist langsamer als das WBB :rolleyes:). :(
Falls jemand einen besseren Weg weiss, das ganze zu machen, bitte Posten.
Thx

--


Dieser Beitrag wurde am 10.07.2002 um 22:07 von Superhausi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
14.07.2002, 12:50
[RMen]OneStone



* Alle Bilder in Array A
* B = Elemente A zählen
* C = Zufallszahl zwischen 0 und B - 1
* male A[C]

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
002
14.07.2002, 14:41
hausi



Dann bräuchte ich also einen 2 dimensionalen Array für A, wenn ich das jetzt richtig verstanden habe?

Braucht zwar mehr Ram, wird aber warscheinlich schneller. Danke.

--

zum Seitenanfang zum Seitenende Profil || Suche
003
14.07.2002, 16:31
Andy_



Also, folgendes kannst du machen wenn du _keine_ lücken bei den ID's hast (1,2,3,5,6..):

Über count-SQL Befehl nur die Anzahl der Einträge finden, zufällige Zahl zwischen der Anzahl-1 und 0 finden, und die dann gezielt über einen normalen SELECT-Befehl anzeigen...

--

42 Es gibt keinen Sinn des Lebens.

zum Seitenanfang zum Seitenende Profil || Suche
004
14.07.2002, 17:00
[RMen]OneStone



Superhausi: Nö, obiger Code ist für Lückenlose Tabellen gedacht.
Andy: Ungefähr das, was ich oben postete.

Für dein Problem:

obiges wie folg ausführen
* für alle Zeilen
* für alle Spalten der vorherig bestimmten Zeile

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/


Dieser Beitrag wurde am 14.07.2002 um 17:00 von [RMen]OneStone bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
14.07.2002, 17:07
Andy_



Wobei meine Art sehr viel Leistungs sparender ist, ein Array mit z.B. 600 einträgen, in dem je eine Zahl ist ist ziehmlich umständlicher als einfach nur eine Variable mit der Anzahl der Einträge.
Zwar brauch man dann 2. Querys, fällt aber trotzdem weniger ins Gewicht.

Fals es ein Lücken Problem gibt: Da es ja sowieso egal ist, an welcher Stelle ein Bild steckt, kann man einfach ein kleines Script basteln, das alle ID's angleicht.

--

42 Es gibt keinen Sinn des Lebens.

zum Seitenanfang zum Seitenende Profil || Suche
006
15.07.2002, 01:36
Kriz



In MySQL gibt es basierend auf SQL den mathematischen Befehl RAND(x). Auszug aus der offiziellen Doku von MySQL:

Zitat:
RAND()
RAND(N)
Returns a random floating-point value in the range 0 to 1.0. If an integer argument N is specified, it is used as the seed value:
mysql> SELECT RAND();
-> 0.9233482386203
mysql> SELECT RAND(20);
-> 0.15888261251047
mysql> SELECT RAND(20);
-> 0.15888261251047
mysql> SELECT RAND();
-> 0.63553050033332
mysql> SELECT RAND();
-> 0.70100469486881

You can't use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. In MySQL Version 3.23, you can, however, do: SELECT * FROM table_name ORDER BY RAND() This is useful to get a random sample of a set SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000. Note that a RAND() in a WHERE clause will be re-evaluated every time the WHERE is executed. RAND() is not meant to be a perfect random generator, but instead a fast way to generate ad hoc random numbers that will be portable between platforms for the same MySQL version.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
007
15.07.2002, 11:03
hausi



Danke Kriz. Hab leider nie 100% geschnallt, für was der Rand-Befehl in MySQL eigentlich von nützen ist (so etwas habe ich schon mal probiert, es dann aber nicht geschafft).

Mein Query müsste dann also ungefähr so aussehen:
Quellcode:
$res=mysql_query("SELECT * FROM pics WHERE category=13 AND locked=0 ORDER BY RAND() LIMIT 6");

Stimmt das?

Die andere Lösung ist leider nicht möglich, da ich in der Tabelle verschiedene Kategorien gemischt habe. Und wenn ich das ganze dann in eine While-Schlaufe nehme, die solange loopt, bis die Kategorie gesetzt ist, dann gibts 1. Endlosschleifen und 2. zu lange Ausführzeiten.

Trotzdem schon mal Danke (natürlich an alle).

--

zum Seitenanfang zum Seitenende Profil || Suche
008
19.07.2002, 13:34
RockingRolli



"ORDER BY RAND()"
geht glaub ich nicht, außer du hast eine Spalte, die "RAND()" heißt ;)

--

zum Seitenanfang zum Seitenende Profil || Suche
009
19.07.2002, 14:58
TheTinySteini



Ich hätte auch nicht geglaubt, dass das geht, aber lies doch mal das Zitat in Kriz' Post... da steht ganz eindeutig, das sowas geht (bzw. gehen sollte =) ).

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
010
20.07.2002, 13:15
apfelkorn



http://www.php.net/manual/de/function.rand.php --comment

Zitat:

In MySQL 3.23 or greater, the following query selects a random row :

SELECT * FROM tablename ORDER BY RAND() LIMIT 1

this does work

also:

SELECT pic FROM pics WHERE category=13 AND locked=0 ORDER BY RAND() LIMIT 1

--


Dieser Beitrag wurde am 20.07.2002 um 13:15 von apfelkorn bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche