2012-03-07 75 views
2

我正在修改一個MySQL語句,但有一些左連接和空白行的麻煩。目前,我有:MySQL左加入 - 值可以爲NULL

SELECT cs.case_id, cs.child_firstname, gu.* 
FROM tblcases AS cs 
LEFT JOIN tblguardians AS gu 
ON cs.case_id = gu.case_id 
WHERE cs.child_firstname = '%craig%' AND gu.firstname LIKE '%sally%' 

此查詢工作正常,只要沒有在「tblguardians」表中的條目,但LEFT JOIN返回NULL,如果沒有記錄 - 因此不會返回入口當我迭代PHP中的結果時。

有沒有辦法從「tblcases」返回字段,無論「tblguardians」是否有相關結果?我想我已經閱讀了太多谷歌頁面,以獲取更多信息!

回答

10

將條件放在WHERE子句中的連接表上會使該連接成爲INNER JOIN。
爲了避免這樣做,你必須在第二個條件添加到您的LEFT JOIN:

SELECT cs.case_id, cs.child_firstname, gu.* 
    FROM tblcases cs 

     LEFT JOIN tblguardians gu 
     ON cs.case_id = gu.case_id 
    AND gu.firstname LIKE '%sally%' /* <- this line was moved up from WHERE */ 

    WHERE cs.child_firstname = '%craig%' 
+1

很棒的答案,非常感謝。進一步修改以適應我的需求,但讓我完全正確的軌道。 – 2012-03-07 20:16:23

1

你在gu過濾;如果tblguardians表中沒有條目,則沒有結果將與該WHERE條款匹配。

4

你必須稍微調整你的查詢。將條件放在WHERE子句中將始終刪除整行。由於tblguardians條目可能爲空,因爲LEFT JOIN,因此無法刪除整行而無法與其中的firstname列進行比較。

既然你想要結果,即使在tblguardians中沒有匹配,你也需要將你的條件移到JOIN中的ON子句。這隻會從該表中刪除(設置爲NULL)行的結果,而不是整行。

SELECT cs.case_id, cs.child_firstname, gu.* 
FROM tblcases AS cs 
LEFT JOIN tblguardians AS gu 
ON cs.case_id = gu.case_id AND gu.firstname LIKE '%sally%' 
WHERE cs.child_firstname = '%craig%' 
+0

同樣的SQL同時回答並同時發佈。如果可能的話,會被接受爲第二個答案! – 2012-03-07 20:19:04

0

LEFT JOIN語句只允許顯示空白列右側的結果。如果你想顯示兩個空白欄,你應該使用FULL OUTER JOIN。所以用方法你將有空白欄和空白欄。

SELECT cs.case_id, cs.child_firstname, gu.* 
FROM tblcases AS cs 
FULL OUTER JOIN tblguardians AS gu 
ON cs.case_id = gu.case_id 
WHERE cs.child_firstname = '%craig%' AND gu.firstname LIKE '%sally%'