1

ランダムな mysql/php クエリを実行する方法は既に知っていますが、既にクエリされた行を追跡するにはどうすればよいでしょうか。ユースケース: 10 問のクイズ。質問はランダムな順序にする必要があります。質問 (行) 2、5、6、8、9 は既に回答済みですが、質問 1、3、4、7、10 は残っていることを追跡するにはどうすればよいですか。これが私がこれまでに持っているものです:

$current_test = $_SESSION['testid'];
// v v v query for this TEST
$tests = mysql_query("SELECT * FROM the_tests WHERE the_tests.testid=$current_test");
$test = mysql_fetch_array($tests);
// ^ ^ ^ query for this TEST


// v v v query for the QUESTIONS from this Test
// Generate
if ($test['randomize']==1){
    $offset_result = mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM the_questions WHERE the_questions.test_id_q=$current_test");//SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM the_questions WHERE `qid` NOT IN (1,5,6) AND the_questions.test_id_q=1
    $offset_row = mysql_fetch_object($offset_result);
    $offset = $offset_row->offset;
    $questions = mysql_query("SELECT * FROM the_questions WHERE the_questions.test_id_q=$current_test LIMIT $offset, 1 " );
}else{
    $questions = mysql_query("SELECT * FROM the_questions WHERE the_questions.test_id_q=$current_test");
}
$totalQuestions = mysql_query("SELECT * FROM the_questions WHERE the_questions.test_id_q=$current_test");
$totalQs = mysql_num_rows($totalQuestions);
$testQ = mysql_fetch_array($questions);

前もって感謝します!

4

2 に答える 2

1

これが私が思いついたものです:

$_SESSION['qList'] が次のような配列であると仮定します。

$_SESSION['qList'] = array(1,2,3,4,5,6,7,8,9,10);

ユーザーが質問を送信すると、値が現在の質問 ID である <input type="hidden" value="5"...> があります。以下の$eliminateQは、この質問 ID です。

$_SESSION['qList'] = array_diff($_SESSION['qList'],array($eliminateQ));
$_SESSION['qList'] = array_values($_SESSION['qList']);
$questions = mysql_query("SELECT * FROM tan_questions WHERE test_id_q=$current_test AND qid IN (".implode(',',$_SESSION[qList]).") ORDER BY RAND() LIMIT 1");

これにより、ID 番号 5 のない更新された qList 配列が生成されます。

$_SESSION['qList'] = array(1,2,3,4,6,7,8,9,10);

そして、質問がなくなるまですべてが続きます。そのインスタンスには、ユーザーを結果ページに転送する if() ステートメントがあります。ビオラ!

@pixeline さん、ご意見ありがとうございます。私はあなたのNOT INを取り、それをINに逆にしました。:)

于 2012-05-27T01:51:13.757 に答える
1

そのSQL WHERE句を補完しようとしていますNOT IN (5,23,45);

したがって、基本的には、ランダムなアイテム ID 値ごとに配列を保持し、それを SQL 句にフィードします。

mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM the_questions WHERE the_questions.test_id_q=$current_test AND the_questions.id NOT IN (".implode(',',$excluded).")");

ここで、別の疑問が生じます: $excluded 配列です。一時的な除外にする必要がありますか、それとも永続的な除外にする必要がありますか? 永続的でない場合は、セッションに保存します (例: $_SESSION['excluded'] )。ユーザーが 3 日後に来れば、おそらくその質問に再回答できるでしょう。

それが永続的でなければならない場合は、その質問に回答したという事実をその質問専用の列に保存するか、単に回答があるかどうかを確認してください。

mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM the_questions WHERE the_questions.test_id_q=$current_test AND the_questions.answer ==''");
于 2012-05-24T20:33:17.667 に答える