2009-08-16 10 views
10

Ich entwickle eine Quiz-Website, und ich habe eine Datenbank, die alle Fragen speichert. Es gibt verschiedene Arten von Quizzes, wie Mathe, Wissenschaft, Geschichte usw. Alle Fragen werden in einer Tabelle gespeichert.Auswählen von zufälligen Zeilen in MySQL

sieht Meine Fragen Tabelle wie folgt aus: Jetzt

questions (qno(int) ,type(int), question, .... ,...) 

qno der Primärschlüssel ist, und type verwendet wird, den Überblick über die Quiz-Typ zu halten .:

if type = 1 (math) 
type = 2(science) 

, ich will wählen einige zufällige Fragen für jede Art von Test. Zum Beispiel möchte ich einige zufällige 20 Fragen nur für den Mathe-Test auswählen.

Hat MySQL eine Möglichkeit, zufällige Zeilen auszuwählen?

+0

dup von [Wie fordere ich eine zufällige Zeile in SQL an?] (Http://stackoverflow.com/q/19412/), [schnelle Auswahl einer zufälligen Zeile aus einer großen Tabelle in mysql] (http: // stackoverflow.com/q/211329/90527). – outis

+0

[MySQL wählen 10 zufällige Zeilen aus 600K Zeilen schnell] (https://Stackoverflow.com/a/4329447/6521116) –

Antwort

19

Sie können die Funktion rand in MySQL verwenden, um die Zeilen zu sortieren, und dann die oberen 10 (oder wie viele Sie wollen) mit limit übernehmen.

select * from table order by rand() limit 10 

Wenn Sie nur die mathematischen Fragen wollen:

select * from table where type = 1 order by rand() limit 10 
+0

Ich möchte Benutzer eine Frage auf einmal zeigen. So denke ich ist, dass ich die oben genannte Abfrage verwenden werde, wenn das Quiz anfängt, und dann werde ich alle Frage no in der Sitzung speichern, und dann werde ich jede Frage durch das Verwenden einer neuen Frage jedes Mal fectcten. Ist es richtig? – user156073

+0

Wenn Sie nur eine Frage pro Seite haben möchten, wählen Sie "Limit 1" anstelle von "Limit 10". – Eric

+0

Speichern Sie die Fragen, die der Benutzer in einer Tabelle gesehen hat, und konstruieren Sie dann diese Abfrage, die sich links mit dieser Tabelle verbindet und in der das Feld der gesuchten Tabelle den Wert null hat. – Unsliced

3

eine Spalte zu Ihrer Tabelle hinzufügen, die einen UNIX-Zeitstempel halten werden.

Einmal am Tag oder in einem Zeitrahmen, der für Sie arbeitet, führen Sie eine Abfrage aus, die diese Spalte aktualisiert.

In diesem Fall sollte Ihre Abfrage um Mitternacht ausgeführt werden und so etwas aussehen.

UPDATE table SET rand_id = (UNIX_TIMESTAMP() + (RAND() * 86400)); 

Um die Zeilen abzurufen, verwenden Sie eine ähnliche Abfrage.

SELECT * FROM table WHERE rand_id > UNIX_TIMESTAMP() ORDER BY rand_id ASC LIMIT 20 

eine Spalte mit einem vorgegebenen Zufallswert Mit sparen Sie eine Randomisierung Funktion für jede einzelne Zeile in der Tabelle für jede einzelne Anfrage an der Seite laufen zu müssen.

0

Eine weitere Möglichkeit besteht darin, eine random permutation10 zu generieren, diese in einer Sitzung zu speichern (oder nur den Teil, den Sie brauchen, der Algorithmus ist leicht anpassbar) und die Fragen zu holen, wenn Sie sie brauchen.

Verwandte Themen