2016-07-12 12 views
0

私はmoodle Multitrackを使ってキャリアアセスメントテストを開発しています。私は一度に1つの質問をランダムな質問を表示するようにプラグインを変更したい。したがって、合計10の質問がある場合は、ランダムな質問が最初に表示され、保存された後、残りの9つの質問からランダムな質問が表示されます。テーブルからランダムに質問を繰り返し表示しない

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

質問が「ソート順」列に基づいてソートされています。質問は、フィールドである「magtest_question」と呼ばれるテーブルに保存されています。だから私はランダムに並べ替えるためにクエリを変更しようとしました。

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

しかし、同じ質問が再び表示されることがあります。私は試行される質問を避けたい。どのようにSQLクエリを使用してこれを達成することができます。助けてください。

+1

このような

何かに答えてきた質問を除外する必要があります。これはランダムに配置された一連の質問を構築するために使用できます。 (例えば)PHPのシャッフル機能を使用しても同じ効果が得られます。 – Strawberry

+0

+1ストロベリーの答えです。データテーブルの値が重複していないか確認してください。前述のクエリは重複した値を生成すべきではありません。 – Djeramon

+0

@Djeramon 5つの質問で試してみましたが、同じ質問が再び表示されています。 – user1690835

答えて

1

すべての10個の質問のIDをランダムな順序でクエリし、クエリで返された順序でIDをセッションに格納してから、質問を1つずつ取得します。このようにしてorder by rand()クエリを1回発行するだけで、質問は繰り返されません。

+0

ページングがあります。私は一度に1つの質問しか表示しません。したがって、クエリが必要になります。 – user1690835

+0

この解決法が最善の方法です。 SQLのRAND()をセッション配列内のIDだけを取得するようにします。次に、質問のIDの配列を読み、それぞれのIDについてその情報を取得するためのクエリを作成します。それはどうやって行かなければならず、ページングは​​問題ではない –

+0

@ThomasGはい。一度に1つの質問だけでOKです。いいえ。ページ内の質問の数は動的な値です。だから将来的にいつでも、ページ内の質問の数が問題になります。 – user1690835

0

はすでに再び同じ質問を表示しません

$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

ここでページングを行うにはどうしたらいいですか? – user1690835

関連する問題