2014-12-27 44 views
0

我有四個表是這樣的:加入特定的按鍵不靈

  • 學年(ID
  • 學生(IDschoolyear_id
  • 測試(ID
  • grade(idtest_idstudent_id數據,得分)

學生與schoolyear(通過FK關聯),其級別與teststudent通過FK的關聯。

我希望無論如何都要返回某個特定學年的所有學生,並且如果該學生存在,則可以加入該學生的測試score以及所有其他字段。如果不是,則score字段應該爲空。這是我有什麼:

SELECT *, `student`.`id` as `studentid` 
FROM `student` 
LEFT JOIN `grade` ON `grade`.`student_id` = `student`.`id` 
WHERE `student`.`schoolyear_id` = ? 

我目前的聲明中沒有任何內容告訴它一個特定的測試,但這就是我想要的。

+1

您能提供樣本數據和期望的結果嗎?有點困惑,因爲要理解。 – sgeddes

+0

@sgeddes我希望學生表中的每個字段以及來自該測試的字段「評分」。 – ncf

回答

1
SELECT *, `student`.`id` as `studentid`, t.* 
FROM `student` 
LEFT JOIN `grade` ON `grade`.`student_id` = `student`.`id` 
LEFT JOIN `test` t ON `t`.`id` = `grade`.`test_id` 
WHERE `student`.`schoolyear_id` = ? 
and test_id = ? 
+0

工作,但不返回所有學生,不管是否有得分(我的問題不清楚,所以這是我的錯)。 – ncf

+0

當你說所有的學生,你的意思是所有學年? –

+0

不,''學生'有一個'schoolyear_id'的fk,所以我只想要那個學年的學生。 – ncf

0

只需將條件添加到ON子句。這將確保學生保持包括在內,即使該考試沒有成績。

SELECT g.*, s.id 
FROM Student s 
LEFT JOIN Grade g 
ON g.student_id = s.id 
AND g.id = ? 
WHERE s.schoolyear_id = ?