2013-11-14 2 views
0

4 개의 테이블을 결합하고 싶습니다. 36 행을 반환하는 동안 4 행을 반환 할 것으로 기대합니다. 그것은 내가 기대하는 결과가 9 번 반복된다는 것을 의미합니다.JOIN을 사용할 때 예상보다 많은 행을 얻습니다.

$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 번이나 해. 모든 순열을 반환합니다 (정확한 단어가 영어 인 경우). 3 가지 질문과 3 가지 후보자가있는 1 가지 시험이 있습니다. 첫 번째 응시자는 3 개의 질문에 답변했고 두 번째 후보자는 1 개를, 세 번째 후보자는 시험에 응하지 않았습니다. 1 * 3 * 3 * 4 = 36

JOIN을 여러 번 사용했지만 실제로는 혼란 스럽습니다. 뭐가 잘못 되었 니?!

+0

studentID별로 그룹화를 시도하셨습니까? – Jim

+0

@jim 아니요. 나는 그것이 무엇인지 알지 못합니다. – CodeLiker

답변

1

studentexam, 질문 및 답변 간의 조인에는 제한이 없으므로 모든 시험에서 모든 학생들에게 모든 질문을 다시 표시하고 모든 질문을 다시 받게됩니다.

나는 모든 질문과 모든 시험을 치른 데카르트 제품이 아니라 각 학생이 주어진 질문에 대한 답에만 관심이 있다고 생각합니다.

그래서 답은 당신은 전체 쿼리가 원하는 것 모두가 examid이기 때문에 나는 또한, 테이블 시험을 왼쪽

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" 

주 같은 것

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

에 가입하려는 이미 studentexam에 있습니다

+0

위대한, 지금은 제대로 작동합니다! 나는 하루 종일 그것을 포함하고 있었다. 모든 테이블이 필요하지만 "JOIN"절에 "AND"와 같은 것이 있다는 것을 알지 못했습니다. – CodeLiker

+0

테이블과 관련이없는 간단한 제약 조건을 포함 할 수도 있습니다. 'id = table A.id 및 tableB.type ='foo''에 테이블 B에 가입하십시오. – oerkelens

+0

내 문제는 해결 될뿐만 아니라 고유 한 sth을 배웁니다. 황갈색의 – CodeLiker

관련 문제