0

我正在使用 AJAX、PHP 和 MySQL 构建一个小型测验/测试引擎。所有数据(问题、答案等)都存储在数据库中。

我遇到的问题是我无法找到如何过滤掉已登录用户已回答的问题,因此导致问题被重复和永无止境的测验/测试。

当您单击“下一个问题”按钮时,会发送一个 AJAX 请求来submit_answer.php提交答案(将行添加到user_answers表中),它还会发送一个请求get_question.php,然后返回问题信息(问题、答案等)的 JSON,但是我似乎无法不选择已回答的问题(表中的问题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只要至少有一个不属于该问题的答案 -任何答案,它就会匹配。

于 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 回答