Zufallszugriff auf Datenbank



  • Hallo,
    ich habe in meinem Programm eine Datenbank und lasse die Einträge in DBEdit Felder ausgeben.
    Nun möchte ich das wenn ich einen Button klicke, dass ein zufälliger Datensatz angezeigt wird, wie ist das möglich???



  • Hallo

    Dazu reicht bereits eine SQL-Anweisung, ausgeführt von einen TQuery

    SELECT * FROM table ORDER BY RANDOM() LIMIT 1
    

    bis bald
    akari



  • RANDOM ist doch ein wiederholvorgang, müsste es nicht eher sowas wie SHUFFLE sein (wenn es sowas gibt)?

    Danke



  • Hallo

    Random erzeugt eine zufällige Reihenfolge der Ergebnisdatensätze.
    Es werden also alle zurückgegeben, bearbeitet von einer "Shuffle"-Methode.
    Durch das LIMIT 1 wird aber die Datenmenge auf den ersten Datensatz eingegrenzt. Dadurch hat man ein Verhalten, das dem vom "Random" entspricht.

    bis bald
    akari



  • Ist der Befehl sicher richtig?
    Bekomme bei mir die Fehlermeldung "Undefinierte Funktion RANDOM"

    Hier mein Quelltext:

    Query1->Close();
    Query1->SQL->Clear();
    Query1->SQL->Add("SELECT * FORM Tabelle1 ORDER BY RANDOM() LIMIT 1");
    Query1->ExecSQL();
    


  • Hallo

    Bei vernünftigen Datenbanken wie PostgreSQL läuft das 😉

    Ansonsten must du eben die Gesamtmenge der Datensätze abfragen (reicht aber die eindeutige ID), diese in ein Array einlesen und davon eine ID per srand/rand auswählen.

    bis bald
    akari



  • Sorry,
    aber mit Datenbanken kenne ich mich nicht so aus und ehrlichgesagt habe ich jetzt kein Wort verstanden. Ich benutze eine Access Datenbank, also .mdb.
    Kannst du mir nicht etwas genauer sagen wo mein Fehler in der SQL Anweisung ist?

    Danke



  • @akari: Leg Dir lieber mal ein standardkonformes DBMS zu. 😉 Ich verwende hier informix und Firebird. Beide kennen RANDOM ebenfalls nicht.



  • Hallo

    aber mit Datenbanken kenne ich mich nicht so aus und ehrlichgesagt habe ich jetzt kein Wort verstanden. Ich benutze eine Access Datenbank, also .mdb.
    Kannst du mir nicht etwas genauer sagen wo mein Fehler in der SQL Anweisung ist?

    Deine Tabelle muß ein Feld haben, das eindeutige IDs beinhaltet. Das ist in den meisten Fällen ein Integer-Feld mit den Eigenschaften Unique, Autoincrement und Primary.
    Du fragst also alle enthaltenden IDs ab und suchst davon eine aus.

    Query1->SQL->Text("SELECT id FROM table");
    Query1->Open();
    if (Query1->ReordCount > 0)
    {
      int zufall = rand() % Query1->RecordCount;
      Query1->RecNo = zufall;
      int zufallindex = Query1->FieldByName("id")->AsInteger; 
      // Die Anzeige per Abfrage mit dem Datensatz aktualisieren, die die ID 'zufallsindex' hat
    }
    

    @ Joe : PostgreSQL ist sehr standardkonform. Leider finde ich keine unabhängige umfangreiche SQL-Standard-Referenz, um nachzuprüfen ob Random() nun im Standard ist oder nicht. Allerdings habe ich die Idee dazu hier her, also ist es nicht nur in PostgreSQL enthalten.

    bis bald
    akari


  • Mod

    Hallo

    bei MySQL ist es vermutlich rand
    bei Access - keine Ahnung - sollte man eigentlich nicht verwenden :p

    Mfg
    Klaus



  • Ja, eine rand-Funktion gibt es im Standard. Die erzeugt aber nur Zufallszahlen, somit wäre dann nicht die Reihenfolge der Tabelle zufällig, sondern nur die Spalte, nach der sortiert wird.

    Nach ORDER BY wird normalerweise der Spaltenname angegeben, nach dem sortiert wird. Hierbei können aber auch Integer-Zahlen angeben werden, diese bezieht sich dann aber auf die Position der Spalte aus dem Select-Statement.
    Oder übersehe ich da etwas?


Anmelden zum Antworten