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 1bis 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
-
Hallo
bei MySQL ist es vermutlich rand
bei Access - keine Ahnung - sollte man eigentlich nicht verwenden :pMfg
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?