如何过滤掉用户已回答的问题?

时间:2012-11-19 22:58:16

标签: php mysql

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

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

当您单击“下一个问题”按钮时,会向submit_answer.php发送一个AJAX请求,该请求会提交答案(向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

enter image description here

user_answers

enter image description here

3 个答案:

答案 0 :(得分: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就会匹配。< / p>

答案 1 :(得分: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

答案 2 :(得分: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之前正确清理数据。