MySQL LEFT JOIN NULL值

时间:2012-07-17 19:30:03

标签: mysql join where

这个问题是在2012年3月回答的问题。由于这是4个月后我提出了一个新问题。参考:MySQL LEFT JOIN - Values can be 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只是通配符
  3. 但是,如果cs.child_firstname只是通配符并且设置了gu.firstname,则返回数据库中的所有行,包括NULL值 - 理想情况下,在这种情况下我不想要NULL值。

    可以重写此查询以执行所有操作,还是需要进行多于1次查询?

    更新

    以下字段是我表单中的字段,所有字段都使用$ _POST传递并使用PHP进行处理。我希望这能说明数据的来源以及它与数据库表的关系。儿童领域位于tblguardians的tblcases和监护人领域。

    • 儿童名字
    • 儿童姓氏
    • 儿童出生日期
    • Guardian Firstname
    • 卫报姓氏
    • Guardian Phone
    • 卫报邮政编码

    更新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)
    

1 个答案:

答案 0 :(得分: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