1

这个问题是对 2012 年 3 月回答的问题的进一步说明。因为这是 4 个月后,我提出了一个新问题。参考: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 值。

可以重写此查询以完成所有操作还是我需要超过 1 个查询?

更新

下面的字段是我表单中的字段,所有字段都使用 $_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)
4

1 回答 1

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
于 2012-11-17T16:42:05.733 回答