这个问题是在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%'


这工作正常:


如果同时设置了两个值(按照上面的示例)。
如果设置了cs.child_firstname并且gu.firstname仅是通配符


但是,如果cs.child_firstname仅是通配符,并且已设置gu.firstname,则将返回数据库中的所有行,包括NULL值-理想情况下,我不希望使用NULL值。

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

更新资料

下面的字段是我表单中的字段,所有字段都使用$ _POST传递并使用PHP处理。我希望这能说明数据来自何处以及与数据库表的关系。子字段在tblcases中,监护人字段在tblguardians中。


儿童名字
子姓
子女出生日期
监护人名字
监护人姓氏
监护人电话
监护人邮政编码


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

最佳答案

听起来理想的解决方案是“完全连接”-返回两个表中的所有行,然后使用where子句消除“两面均为空”的位置-例如ifnull(gu.firstname,c.child_firstname)不为null

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

关于mysql - MySQL LEFT JOIN NULL值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11529512/

10-11 07:19