2016-07-12 7 views
0

Ich verwende Moodle Multitrack Test für die Entwicklung einer Karriere Assessment-Test. Ich möchte das Plugin ändern, um zufällige Fragen zu zeigen, eine Frage nach der anderen. Also, wenn es insgesamt 10 Fragen gibt, dann sollte es zuerst eine zufällige Frage zeigen und nachdem es gespeichert ist, dann zeige eine zufällige Frage von den restlichen 9 Fragen und so weiter. Fragen werden in einer Tabelle gespeichert namens ‚magtest_question‘, deren Felder sind:Zeigen Sie zufällige Fragen aus einer Tabelle ohne Wiederholung

id(bigint), 
magtestid(bigint), 
questiontext(longtext), 
questiontextformat(mediumint), 
sortorder(bigint). 

Die Fragen werden sortiert auf der Grundlage der ‚sortorder‘ Spalte. Also habe ich versucht, die Abfrage zu ändern, um nach dem Zufallsprinzip zu sortieren.

SELECT * FROM {magtest_question} WHERE magtestid=? ORDER BY RAND() 

Aber es wird manchmal wieder die gleiche Frage zeigen. Ich möchte die Fragen vermeiden, die versucht werden. Wie kann ich dies mit SQL-Abfrage erreichen. Bitte helfen Sie.

+1

Dies wird nicht die gleiche Frage zeigen wieder beantwortet. Dies kann verwendet werden, um ein Array von Fragen zu erstellen, die zufällig angeordnet sind. Der gleiche Effekt kann zum Beispiel mit der Shuffle-Funktion von PHP erreicht werden. – Strawberry

+0

+1 für Erdbeeren antworten. Überprüfen Sie, ob in Ihrer Datentabelle doppelte Werte vorhanden sind. Die angegebene Abfrage sollte keine doppelten Werte erzeugen. – Djeramon

+0

@Djeramon Ich habe mit 5 Fragen versucht, und es zeigt wieder die gleiche Frage. – user1690835

Antwort

1

Fragen Sie die IDs aller 10 Fragen in zufälliger Reihenfolge ab, speichern Sie die IDs in einer Sitzung in einem Array in der Reihenfolge, die von der Abfrage zurückgegeben wird, und rufen Sie die Fragen anschließend einzeln ab. Auf diese Weise geben Sie nur einmal eine order by rand() Abfrage aus und die Fragen werden nicht wiederholt.

+0

Es gibt Paging. Ich möchte nur eine Frage auf einmal zeigen. Daher wird eine Abfrage benötigt. – user1690835

+0

Diese Lösung ist der beste Ansatz. Machen Sie die RAND() in SQL, um nur die IDs in einem Sitzungsarray abzurufen. Dann lesen Sie das Array der Frage-IDs und für jede von ihnen machen Sie eine Abfrage, um die Informationen für diese ID abzurufen. So sollte es gehen und Paging ist kein Problem –

+0

@ThomasG Ja. Es ist in Ordnung für jeweils nur eine Frage. Das Nein. von Fragen in einer Seite ist ein dynamischer Wert. Also jederzeit in Zukunft wenn ich die Nr. Ändern möchte. von Fragen in einer Seite wird es dann ein Problem sein. – user1690835

0

Sie müssen die Fragen auszuschließen, die bereits

So etwas wie

$sql = "SELECT q.* 
     FROM {magtest_question} q 
     WHERE q.magtestid = :magtestid 
     AND NOT EXIST (SELECT a.id 
         FROM {magtest_answer} a 
         WHERE a.questionid = q.id 
         AND a.userid = :userid) 
     ORDER BY RAND()"; 

$params = array('magtestid' => $magtest->id, 'userid' => $USER->id); 

$questions = $DB->get_records_sql($sql, $params, $currentpage * $magtest->pagesize, $magtest->pagesize); 
+0

Wie kann ich hier paging machen? – user1690835