Joern: SQL: Einen Datensatz zufällig ausgeben?

Guten Morgen!

Folgendes Problem: Ich möchte auf einer Webseite einen Datensatz ausgeben, aber keine bestimmten, sonder einen zufällig ausgewählten.

Anders ausgedrückt: Funktioniert soetwas irgendwie:

SELECT irgendwas FROM tabelle WHERE Status = 1 AND ID = 'ZUFÄLLIG'

Danke

Joern

  1. Hallo Joern,

    Anders ausgedrückt: Funktioniert soetwas irgendwie:

    SELECT irgendwas FROM tabelle WHERE Status = 1 AND ID = 'ZUFÄLLIG'

    Meines Wissens nach nicht. Du könntest aber die Zeilen der Tabelle zählen (SELECT COUNT(ID)), eine davon zufällig auswählen und dann in einer zweiten Abfrage als ID einsetzen...

    Beste Gruesse,

    Jan

    1. Meines Wissens nach nicht. Du könntest aber die Zeilen der Tabelle zählen (SELECT COUNT(ID)), eine davon zufällig auswählen und dann in einer zweiten Abfrage als ID einsetzen...

      Hallo Jan,
      dieses Lösung ist mir auch schon in den Sinn gekommen, ABER.

      • Ist halt doch etwas doof und aufwendig, für einen kleine Datensatz 2 Abfragen zu machen und zusätzlich noch eine Zufallszahl generieren zu lassen.

      • Funktioniert in meinem Fall ja auch nicht, da ich den Datensatz nicht zufällig aus allen Datensätzen der Tabelle, sondern zufällig nur aus einem Teil (Status =1 z.B.) haben möchte

      1. Hallo!
        Ich geb Dir zwar recht, daß es etwas aufwendig ist, möglich ist es aber auch.
        Streng nach dem Motto geht nicht gibt's nicht ;-)

        Wenn Du es also doch realisieren willst, so mußt Du zuerst ein Recordset erstellen, in dem Deine Bedingung vorkommt.
        Dort hast Du dann z.B. 5 Datensätze enthalten.
        Nun erstellst Du ein Array und liest die Ids in dieses ein.
        Wähle jetzt ein Element zuällig aus dem Array aus und Du hast die ID des "gesuchten" Datensatzes.

        Wenn Du das ganze auch noch universal machen möchtest (vielleicht später nochmal benutzen für andere Recordsets) packts Du das ganze in eine Funktion.
        Ich würde allerdings bei der Funktion auch das erste Recordset mitübergen (und eben nicht erst dort drinnen erzeugen), somit bist Du auch noch unabhängig von Tabellen und Datenbanken.
        Als Rückgabe wert nimmst Du nur noch die ID und fertig!

        Ich habe sowas ähnliches auch mal realisiert.
        Dabei habe ich allerdings noch 2 Sachen angefügt:
        1. Ein zähler, damit nicht zufällig ein Datensatz 5 mal ausgewählt wird
        2. Noch eine Funktion vor der Funktion, die ich oben beschrieben habe. An diese übergab ich nur den Tabellennamen, die Bedingung, die Datenbank und in einem Array die Felder, die ich haben wollte. Zurück kamen in einem Array eben die Werte dieser Felder.

        MfG
        JankoW

        1. Hi,
          danke für die "einfache" Lösung.
          Hört sich aber nicht gerade nach einer Lösung an, die performancemäßig recht schnell ist.

          Werde ich aber mal ausprobieren.

          Joern

  2. Hallo,

    SELECT irgendwas FROM tabelle WHERE Status = 1 AND ID = 'ZUFÄLLIG'

    SELECT * FROM tabelle WHERE Status= 1  LIMIT ".$randomnummer.", ".($randomnummer+1);

    dann mußt du nurnoch eine Spalte aus der zurückgelieferten Zeile zufällig auswählen.

    bye,
    Falk

    1. Hallo !

      SELECT * FROM tabelle WHERE Status= 1  LIMIT ".$randomnummer.", ".($randomnummer+1);

      Aber woher nimmst du jetzt $randomnummer ?

      Die Anzahl der zu erwartenden Ergebnisse ist ohne vorherige Abfrage nicht bekannt, oder doch ?

      Gruß,
      kerki

    2. Hi,
      hört sich nicht schlecht an, nur scheint MS SQL-Server oder access den LIMIT-Befehl nicht zu kennen.

      SELECT * FROM tabelle WHERE Status= 1  LIMIT ".$randomnummer.", ".($randomnummer+1);

      dann mußt du nurnoch eine Spalte aus der zurückgelieferten Zeile zufällig auswählen.

      bye,
      Falk