2012-07-17 174 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