2012-07-17 194 views
1

這個問題更進一步於2012年3月回覆。這是4個月後,我提出了一個新問題。參考:MySQL LEFT JOIN - Values can be NULL,因爲它代表MySQL LEFT JOIN NULL值

我的SQL語句低於:

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 '%Craig%' 
WHERE cs.child_firstname LIKE '%Sally%' 

這工作得很好:

  1. 如果兩個值(根據上面的例子)設置。
  2. 如果cs.child_firstname設置和gu.firstname是一個通配符只能

但是,如果cs.child_firstname只是一個通配符和gu.firstname設置,那麼數據庫中的所有返回行,包括NULL值 - 理想情況下,我不想要NULL值。

該查詢可以重寫爲執行所有操作還是需要查詢多個查詢?

更新

下的字段都在我的窗體中的字段,所有使用$ _ POST傳遞和使用PHP處理。我希望這給出了一些數據來自何處的指示以及它與數據庫表的關係。孩子們的田地在坦布爾人的田地和監護人地裏。

  • 兒童姓
  • 兒童姓氏
  • 出生
  • 兒童日期
  • 衛姓
  • 衛姓
  • 手機衛士
  • 衛郵編

更新2

SQL查詢如下內容:

SELECT 
    DISTINCT(cs.case_id) AS case_id, CONCAT(cs.child_firstname, ' ', child_surname) AS childname, DATE_FORMAT(child_dob, '%d/%m/%Y') AS child_dob, DATE_FORMAT(created, '%d/%m/%Y') AS created, gu.firstname, gu.surname 
FROM 
    tblcases AS cs 
LEFT JOIN tblguardians AS gu 
    ON cs.case_id = gu.case_id 
    AND gu.firstname LIKE '%$_POST[parent_firstname]%' 
    AND gu.surname LIKE '%$_POST[parent_lastname]%' 
WHERE 
cs.child_firstname LIKE '%$_POST[child_firstname]%' 
AND cs.child_surname LIKE '%$_POST[child_surname]%' 
AND ('$_POST[child_firstname]' != '' OR gu.firstname IS NOT NULL) 
+0

你填充從代碼'LIKE'值? – 2012-07-17 19:33:47

+1

如果你想替換空值使用IFNULL(列,defaultvalue),或者如果你想避免整個記錄,然後使用內連接,而不是左連接 – 2012-07-17 19:45:52

+0

@Michael - 是的,像這樣:'%$ _ POST [child_firstname]% ' ruakh - 我的意思是,如果提交表單時$ _POST值爲空,則SQL查詢將僅爲通配符(即。gu.firstname LIKE'%%') – 2012-07-17 19:57:54

回答

0

聽起來像是理想的解決方案將是一個「全連接」 - 從兩個表返回所有的行,然後你可以使用where子句消除「雙方無效」的地方 - 例如IFNULL(gu.firstname,cs.child_firstname)不爲空

MySQL不支持全連接,以便那麼你最好的選擇將是一個工會像

select blah 
from tblcases 
join tblguardians on blah 
where tblcases.child_firstname like childINPUT 

union 

select blah -- same blah as aobve 
from tblcases 
join tblguardians on blah 
where tblguardians.firstname like guardianINPUT