0

AJAX、PHP、および MySQL を使用して小さなクイズ/テスト エンジンを構築しています。すべてのデータ (質問、回答など) はデータベースに保存されます。

私が抱えている問題は、ログインしているユーザーが回答した質問を除外する方法がわからないため、質問が繰り返され、クイズ/テストが終わらないことです。

「次の質問」ボタンをクリックするとsubmit_answer.php、回答を送信する (テーブルに行を追加する) AJAX リクエストが送信され、質問情報 (質問、回答など) の JSON を返すuser_answersリクエストも送信されますが、get_question.php回答済みの質問 (user_answers表内の質問) を選択しないようにすることはできないようです。これが私が今持っているものです:

$question = mysql_query("SELECT *, q.id qid, q.question question_text 
                         FROM questions q, user_answers ua
                         WHERE q.id != ua.question_id 
                           AND ua.test_id = $test 
                           AND ua.user_id = $_SESSION[userid] 
                         ORDER BY rand() 
                         LIMIT 1");

$q = mysql_fetch_assoc($question);

test_idこのクエリは、現在のテストの を持ち、user_id現在のユーザーとして を持ち、テーブルにない質問を選択することになっていuser_answersます。しかし、明らかに、私はそれを正しく行っていません。

get_question.phpここでファイル全体を見ることができます: http://pastebin.com/Td6mqp49

編集:

@MadaraUchiha から要求されたテーブル構造は次のとおりです。

questions

ここに画像の説明を入力

user_answers

ここに画像の説明を入力

4

3 に答える 3

3
SELECT *, q.id qid, q.question question_text 
FROM questions q
WHERE NOT EXISTS (
    SELECT TRUE
    FROM user_answers ua
    WHERE ua.question_id = q.id
    AND ua.test_id = $test 
    AND ua.user_id = $_SESSION[userid]
)
ORDER BY rand() 
LIMIT 1

クエリが機能しなかった理由は、質問に属さq.id != ua.question_idない回答が少なくとも1つある限り、一致するためです。

于 2012-11-19T23:01:15.520 に答える
2

user_answers テーブルへの質問の間に左外部結合が必要です。

最終的なクエリは次のようになります。

SELECT *, q.id qid, q.question question_text 
FROM questions q left outer join
     user_answers ua
     on q.id = ua.question_id and
        ua.test_id = $test and
        ua.user_id = $_SESSION[userid] 
WHERE ua.user_id is null
ORDER BY rand() 
LIMIT 1
于 2012-11-19T23:02:47.423 に答える
1
SELECT * FROM
questions q
WHERE 
q.id NOT IN (
    SELECT question_id as id
    FROM user_answers
    WHERE ua.test_id = $test AND ua.user_id = $_SESSION[userid]
)

補足として、SQL に渡す前にデータを適切にサニタイズしてください。

于 2012-11-19T23:03:22.647 に答える