5 Datensätze per Zufall auswählen und ausgeben

5 Datensätze per Zufall auswählen und ausgeben

am 16.11.2006 08:28:10 von Tatjana Hussel

Ich habe in einer Tabelle hunderte von Datensätze alle haben eine ID, doch
sind teilweise auh IDs gelöscht.

z.B.
100, 101, 103, 104,105, 107,108

nun möchte ich 5 Datensätze zufallsmässig aus dieser Tabelle auslesen


$sql = "id,name* from test LIMIT 5
$result = mysql_query($sql) or die ($sql.'
'.mysql_error());
while ($ausgabe = mysql_fetch_object($result))

so bekomme ich die ersten 5 Datensätze, wie mache ich es aber das diese per
Zufall gemischt sind.

Tatjana

Re: 5 Datensätzeper Zufall auswählenund ausgeben

am 16.11.2006 08:30:46 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: 5 Datensätze per Zufall auswählen und ausgeben

am 16.11.2006 08:33:10 von Claus Reibenstein

Tatjana Hussel schrieb:

> so bekomme ich die ersten 5 Datensätze, wie mache ich es aber das diese per
> Zufall gemischt sind.

Ein Blick ins Manual brachte dieses hier hervor:

SELECT ... ORDER BY RAND()

Testen musst Du es aber selber.

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: 5 Datensätze per Zufall auswählen und ausgeben

am 16.11.2006 09:31:23 von Guido Schmidt

Claus Reibenstein schrieb:

> SELECT ... ORDER BY RAND()
>=20
> Testen musst Du es aber selber.

Und falls es ein paar mehr Datensätze sind (oder mittelfristig werden) =

noch das hier lesen:

http://jan.kneschke.de/projects/mysql/order-by-rand/

Guido

Re: 5 Datensätze per Zufall auswählen und ausgeben

am 16.11.2006 11:18:07 von Claus Reibenstein

Guido Schmidt schrieb:

> Claus Reibenstein schrieb:
>
>> SELECT ... ORDER BY RAND()
>>
>> Testen musst Du es aber selber.
>
> Und falls es ein paar mehr Datensätze sind (oder mittelfristig werden)
> noch das hier lesen:
>
> http://jan.kneschke.de/projects/mysql/order-by-rand/

Auch keine schlechte Idee.

Das Problem hierbei ist, dass die ID bei Tatjana Lücken haben kann,
wobei es viele Gründe geben kann, diese Lücken auch wirklich drin zu
lassen. Das heißt, für manche Zahlen wird man keinen Datensatz bekommen
und muss diesen Fall separat behandeln, und je mehr Lücken drin sind,
desto häufiger wird dieser Fall eintreten.

Um dieses Problem zu lösen, könnte man nur für diesen Zweck eine weitere
Spalte einfügen, in der einfach alle Datensätze durchnummeriert werden
und die man ständig konsistent hält. Wenn also z.B. ein Datensatz
gelöscht wird, muss der Datensatz mit der bisher höchsten Nummer die
Nummer des gelöschten Datensatzes erhalten (es sei denn, der gelöschte
war genau dieser Datensatz) und die Nummer für den nächsten
einzufügenden Satz zurückgesetzt werden. Mit AUTO_INCREMENT kommt man da
also nicht weit.

Ob dieser Aufwand sinnvoll ist, hängt von der Situation ab. Einerseits
beschleunigt es die zufällige Suche, da es keine Fehlsuchen mehr gibt.
Andererseits erzeugt es bei jeder Änderung zusätzlichen Overhead, und
natürlich erhöht sich auch der Speicherverbrauch der DB.

Ein weiteres Problem: man bekommt immer nur _einen_ Datensatz geliefert.
Man muss also mindestens 5 Abfragen schicken, wobei man möglicherweise
sogar einzelne Datensätze mehrfach bekommen kann. Dies muss man alles
abfangen, was mit reinem SQL wohl etwas schwierig werden dürfte.

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /

Re: 5 Datensätze per Zufall auswählen und ausgeben

am 16.11.2006 11:33:54 von Guido Schmidt

Claus Reibenstein schrieb:

>> http://jan.kneschke.de/projects/mysql/order-by-rand/
>=20
> Auch keine schlechte Idee.

[.. ganz viel Text...]
Wenn Du den Text bis zu Ende gelesen hättest, dann wüsstest Du, das D=
u=20
gerade einige Zeit für 4 überflüssige Absätze Text verschwendet h=
ast :)

Guido

Re: 5 Datensätze per Zufall auswählen und ausgeben

am 16.11.2006 15:08:29 von Claus Reibenstein

Guido Schmidt schrieb:

> Claus Reibenstein schrieb:
>
>>> http://jan.kneschke.de/projects/mysql/order-by-rand/
>>
>> Auch keine schlechte Idee.
>
> [.. ganz viel Text...]
> Wenn Du den Text bis zu Ende gelesen hättest, dann wüsstest Du, das Du
> gerade einige Zeit für 4 überflüssige Absätze Text verschwendet hast :)

Wo siehst Du Parallelen zwischen meinen 4 Absätzen und dem o.g. Artikel?

Die Lückenlösung des Artikels hat zwei gravierende Nachteile:
- Sie treibt den Ressourcenverbrauch in die Höhe.
- Sie stört die Gleichverteilung, und zwar um so empfindlicher, je
größer die Lücken sind.

Meine beiden Lückenlösungen, die ich in den ersten 3 Absätzen
ausführlich behandelt habe, verfolgen zwei ganz andere Ansätze und haben
dieses Problem nicht.

Mein vierter Absatz behandelt das Problem, mehr als einen Datensatz
finden zu wollen. Darauf geht der Artikel mit keiner Silbe ein.

Wenn Du _beide_ Texte bis zu Ende gelesen hättest, dann wäre Dir das
aufgefallen.

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /