2016-06-12 99 views
1

我正在查詢,但無法正常工作。SQL查詢左連接問題

我的表詳情如下:

分區:
ID
Fieldsofstudy

student_subarea:
ID主鍵,
student_id數據,
student_subarea外鍵分區id和student_subarea。

ASK:
我想做到的是獲得所有研究領域中的一列和另一列學生的ID,如果他是班上。否則,顯示null或其他東西。

SELECT a.`id` , a.`name` , a.`area_id` , u. * 
FROM `subarea` a 
LEFT JOIN student_subarea u ON u.subarea_id = a.id 
WHERE u.student_id =50 
OR u.student_id IS NULL 

這樣做根本沒有幫助。我試圖使用函數和子查詢沒有任何成功。有人能幫助我嗎?

+0

您可能需要更新您的答案,包括你使用的是什麼樣的SQL服務器,以及因爲您在嘗試運行您提供的代碼時遇到的任何錯誤消息。 – kbuilds

+0

我沒有收到任何錯誤。我只是一遍又一遍地選錯了數據,我不知道如何得到我之前說的。 – lostintheriver

回答

2

一般的規則爲left join和過濾是將過濾子句on子句爲所有,但第一個表英寸所以這可能會做你想要的:

SELECT a.`id`, a.`name`, a.`area_id`, u. * 
FROM `subarea` a LEFT JOIN 
    student_subarea u 
    ON u.subarea_id = a.id AND u.student_id = 50; 

你怎麼記得這個邏輯? A left join返回第一個表中的所有行,即使第二個表上沒有匹配。這似乎是你想要的。

與你的邏輯問題是,學生以外的其他學生50匹配的邏輯。所以,這些行會被過濾掉。

+0

謝謝戈登。很好的解釋! – lostintheriver

0

移動過濾器標準的JOIN

SELECT a.`id` , a.`name` , a.`area_id` , u. * 
FROM `subarea` a 
LEFT JOIN student_subarea u 
    ON u.subarea_id = a.id 
    AND u.student_id =50 
0

你應該把條件對學生ID連接條件內,而不是在where子句:

SELECT a.id, a.name , a.area_id, u.* 
FROM  subarea a 
LEFT JOIN student_subarea u 
     ON u.subarea_id = a.id 
     AND u.student_id = 50