0

我想加入4张桌子。我希望它在返回 36 行时返回 4 行。这意味着我期望的结果重复 9 次。

$result=mysql_query("SELECT * 
FROM exam 
INNER JOIN studentexam ON exam.id = studentexam.examID
INNER JOIN question ON exam.id = question.examID
INNER JOIN answer ON exam.id = answer.examID
WHERE exam.id=$examID");

while($row=mysql_fetch_array($result)){
if($row['type']=='singleChoice'){
    print $row['examID'].'*'.$row['studentID'].'*'.$row['questionID'].'<br>';   
}
}

我想要的结果是:99*922723627*25 -- 99*922723627*26 -- 99*922723627*27 -- 99*922723628*25 -- 但我得到了 9 次。它返回所有排列(如果它是正确的英文单词)。我有 1 次考试,有 3 个问题和 3 名考生。第一名考生答了 3 道题,第二名考生答了 1 题,第三名考生没有参加考试。1*3*3*4 = 36

我已经多次使用 JOIN 但对此感到非常困惑。怎么了?!

4

1 回答 1

1

由于学生考试、问题和答案之间的任何连接都没有限制,因此您将获得所有学生参加给定的考试,每条记录又是所有问题,又是所有问题。

我猜你只对每个学生对特定问题的答案感兴趣,而不是所有考试问题和所有参加考试的学生的笛卡尔积。

所以你想加入的答案

    answer.examid = exam.id
AND answer.studentid = student.id
AND answer.questionid = question.id

整个查询将类似于

SELECT studentexam.examId, studentexam.studentid, question.id, answer.id 
FROM studentexam 
INNER JOIN question ON exam.id = question.examID
INNER JOIN answer ON answer.examid = exam.id
                 AND answer.studentid = studentexam.studentid
                 AND answer.questionid = question.id
WHERE exam.id=$examID"

请注意,我也省略了桌面考试,因为您似乎想要的只是已经在 studentexam 中的考试

于 2013-11-14T19:13:25.387 回答