1

我正在为希望自动保存他们的测验结果的客户构建一个测验,我遇到了一个问题,我正在尝试选择用户在某个测验中没有回答的所有问题,我是保存已回答到表格的每个问题的结果,RESULTS但是当一个以上的用户在表格中得到结果时,我的陈述会变得混乱RESULTS,如果有人可以查看我的代码并给我任何建议,我将非常感激。提前致谢!

基于这些表和语句,我需要加载的下一个问题是que_id = 3use_id = 1但我面临的问题是它返回que_id = 1并且que_id = 3因为它们已被用户回答use_id = 2use_id 3再次感谢!

问题表

que_id qui_id que_question que_ans_id
1      1      lorem 1?     1
2      1      lorem 2?     6
3      1      lorem 3?     12

结果表

res_id res_use_id res_qui_id res_que_id res_ans_id
1      1          1          1          2
2      1          1          2          6
3      2          1          3          10
4      3          1          1          1

PHP

$statement_question = $db->prepare("SELECT * FROM roa_quiz
                                    LEFT JOIN roa_questions ON qui_id = que_qui_id
                                    LEFT JOIN roa_results ON que_id = res_que_id
                                    WHERE qui_id = :qui_id AND res_use_id != :use_id");

$statement_question->setFetchMode(PDO::FETCH_ASSOC); 

$statement_question->execute(array(':qui_id' => 1, ':use_id' => 1));

$question = $statement_question->fetch();
4

2 回答 2

2

您正在尝试获取匹配的行。这个想法是用来left outer join获取匹配的行。. . 然后检查没有匹配的地方。这需要两件事:(1)将条件移动到on子句和(2)检查where子句中是否不匹配:

SELECT *
FROM roa_quiz LEFT JOIN
     roa_questions
     ON qui_id = que_qui_id LEFT JOIN
     roa_results
     ON que_id = res_que_id and res_use_id = :use_id
where qui_id = :qui_id AND results.res_que_id is null
于 2013-06-29T23:31:13.473 回答
0

我会用sql:

SELECT * FROM roa_quiz
JOIN roa_questions ON qui_id = que_qui_id
LEFT JOIN roa_results ON que_id = res_que_id AND res_use_id = :use_id
WHERE qui_id = :qui_id
AND res_id IS NULL

这应该会为您提供一个未回答的问题列表,供用户进行测验。在这里查看一些关于 sql 连接的有用图表。在这种情况下,我们需要一个带有排除项的左外连接。

于 2013-06-29T23:31:19.943 回答