2012-11-26 166 views
0

所以我試圖寫一個簡單的連接從兩個不同的表中拉東西的MySQL查詢。MySQL加入,左加入

拳頭表是學生表(對不起它不是漂亮我找不到更好的辦法來把他們)

id first_name last_name major phone_number 
------------------------------------------------- 
1 Eric  Larsen  CS  1234567891 
2 Sam   Coons  English 1234567891 
3 David  Brown  MAE  1234567891 
4 Richard  Brown  CS  1234567891 
5 Kendra  Griffiths FCHD  1234567891 

第二個是積分榜,豐富現在它只是一個行,

id student_id item_id score 
------------------------------ 
1 1   1  20 

有與項目列表中的第三個表,但是是不是真的需要這個特定的查詢。

我想把所有的學生都帶到scores.item_id = 1,如果他們有分數,如果他們不是,我仍然希望它爲學生提供信息,那麼,最小。

所以這裏是我寫的查詢。

SELECT students.first_name, students.last_name, scores.score 
FROM students 
    LEFT JOIN scores 
    ON students.id = scores.student_id 
WHERE scores.item_id =1 

在我看來這應該工作,應該把所有的學生即使沒有得分對他們來說,因爲它是一個左連接,但它僅與得分埃裏克·拉森,結果拉一個學生貌似

Eric, Larsen, 20 

但它不應該是:

first_name last_name score 
---------------------------- 
Eric  Larsen  20 
Sam   Coons  NULL 
David  Brown  NULL 
Richard  Brown  NULL 
Kendra  Griffiths NULL 

回答

1

此查詢將顯示您的問題。

SELECT students.first_name, students.last_name, scores.score, scores.item_id 
    FROM students 
    LEFT JOIN scores 
     ON students.id = scores.student_id 

你看scores.item_idNULL對於所有其他行,讓你的失敗條款WHERE scores.item_id = 1,因此,這些行不會在搜索結果中出現。

這應該讓你以後

SELECT students.first_name, students.last_name, scores.score 
    FROM students 
    LEFT JOIN scores 
     ON (students.id = scores.student_id) 
    WHERE (scores.item_id = 1 OR scores.item_id IS NULL) 

SELECT students.first_name, students.last_name, scores.score 
    FROM students 
    LEFT JOIN scores 
     ON (students.id = scores.student_id AND scores.item_id = 1) 
+1

這得到了它,而不是= NULL其IS NULL。謝謝你,謝謝你,謝謝你!!! – Beamer180

+0

好了解決了我的答案 – trapper

+0

它看起來像你編輯帖子,因爲我正在添加評論,但這也適用。再次感謝! – Beamer180

0

你需要的聯接的列添加到您的選擇 - 在這裏你已經把你的SQL查詢子句限制結果集一行列

0

的。嘗試刪除where子句。

SELECT students.first_name, students.last_name, scores.score 
    FROM students 
    LEFT JOIN scores 
     ON students.id = scores.student_id; 
+0

問題在於,可能有一些不同的項目,我想獲得分數。例如,可能有兩個項目,在這種情況下,他們將是一個班級的任務。說作業1和作業2,我想讓所有學生的名字和姓氏,如果某個作業記錄了分數,那麼這個分數,如果沒有分數,我仍然想要他們的名字 – Beamer180

+0

這是一個有效的用法案件,但如何做一個左連接去幫助你呢? where子句將結果集限制爲該項目的預期值,無論item_id如何,您要求的結果都會將所有分數拉回。想要拉回分數中的所有條目並通過item_id限制它們之間的衝突。 –

+0

所以應該查詢更像: SELECT student.first_name,student.last_name,scores.score FROM成績 RIGHT JOIN學生 ON scores.student_id = scores.student_id WHERE scores.item_id = 1? – Beamer180

0

您提供了一個where條件過濾掉的記錄刪除WHERE條件,你應該得到你想要的結果的話,結果。