在使用JOIN时,我得到的不仅仅是我期望的行数

时间:2013-11-14 18:45:51

标签: php mysql join

我想加入4张桌子。我希望它返回4行,同时返回36行。这意味着我期望重复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,但真的很困惑。怎么了?!

1 个答案:

答案 0 :(得分:1)

由于对studentexam,问题和答案之间的任何联接没有限制,您将获得所有学生参加给定考试,每次记录再次提出所有问题,并再次提出所有问题。

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

所以你要加入的答案

    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中的考试