Korbinian Bachl: MySQL - zufall ? bzw. wie nutzt man random bei select ?

Hi,

habe ein kleines Problem an dem ich seit 2 Tagen rumrätsel...

ich möchte aus einer tabelle mit 1000 Zeilen 10 ausgeben lassen, welche aber durch zufall ausgesucht werden sollen... sprich ich habe

Zeile 1
Zeile 2
zeile 3
Zeile 4
....
Zeile 1000

soll er mit dann Zeile 6, Zeile 656, zeile 777... Zeile x[10] zurückliefern... ich habe es schon mit select * from table where row = x limit by rand, 10; probiert aber dann bringt er sie ja sortiert zurück bzw. so wie sie in der tabelle stehen...

was kann man da tun ? per PHP / Perl erst 10 zufallszahlen zu suchen udn dann die rows hernehmen und überprüfen ob die bedingung erfüllt wird und wenn nicht nochmal erscheint mir zu aufwendig...

mfg

Korbinian Bachl
www.whiskyworld.de

  1. OK, lösung heisst:

    select * from X where Z = V order by RAND() limit 0,10; sagt zumindest das SelfHTML CHAT - gebe aber keine gewähr...

    mfg

    korbinian bachl

  2. Hallo!

    ich möchte aus einer tabelle mit 1000 Zeilen 10 ausgeben lassen, welche aber durch zufall ausgesucht werden sollen... sprich ich habe

    soll er mit dann Zeile 6, Zeile 656, zeile 777... Zeile x[10] zurückliefern... ich habe es schon mit select * from table where row = x limit by rand, 10; probiert aber dann bringt er sie ja sortiert zurück bzw. so wie sie in der tabelle stehen...

    Eben habe ich mal folgendes angetestet:

    SELECT id FROM tabname ORDER BY RAND() LIMIT 10;

    Es werde immer 10 id's in einer nicht sortieren Reihenfolge ausgegeben!  Selbst mit DESC und ASC weigert sich mySQL, die id's zu sortieren.

    MfG, André Laugks

  3. Hi auch,

    was kann man da tun ? per PHP / Perl erst 10 zufallszahlen zu suchen
    und dann die rows hernehmen und überprüfen ob die bedingung erfüllt
    wird und wenn nicht nochmal erscheint mir zu aufwendig...

    nicht, wenn Du es richtig anfängst.

    Als erstes brauchst Du eine Tabellenspalte, welche zuverlässig eine
    lückenlos aufsteigende positive ganze Zahl enthält.
    Wenn Deine Datenbank das automatisch kann, prima - ansonsten selbst eine
    anlegen, bei INSERTs entsprechenden Wert einfügen und - das ist jetzt
    wichtig - einen UNIQUE INDEX über diese Spalte legen.

    Dann zu Beginn Deiner Aktion ein SELECT COUNT(*) FROM <tabelle> feuern.
    Dadurch bekommst Du die Information, welche Zeilen vorhanden sind.

    Jetzt kann es mit dem Würfeln losgehen!

    Du kannst nun über Deine Nummern-Spalte gezielt einzelnen Zeilen auswählen.
    Durch den UNIQUE INDEX ist sowohl die Eindeutigkeit als auch die Performan-
    ce des Zugriffs sichergestellt.

    Viele Grüße
          Michael