MySQL左连接-值可以为NULL

MySQL左连接-值可以为NULL,mysql,sql,join,Mysql,Sql,Join,我正在修改一个MySQL语句,但是左连接和空行有一些问题。目前我有: SELECT cs.case_id, cs.child_firstname, gu.* FROM tblcases AS cs LEFT JOIN tblguardians AS gu ON cs.case_id = gu.case_id WHERE cs.child_firstname = '%craig%' AND gu.firstname LIKE '%sally%' 只要tblguardians表中有一个条目,这

我正在修改一个MySQL语句,但是左连接和空行有一些问题。目前我有:

SELECT cs.case_id, cs.child_firstname, gu.*
FROM tblcases AS cs 
LEFT JOIN tblguardians AS gu
ON cs.case_id = gu.case_id 
WHERE cs.child_firstname = '%craig%' AND gu.firstname LIKE '%sally%'
只要tblguardians表中有一个条目,这个查询就可以正常工作,但是如果没有记录,左连接将返回NULL——因此在PHP中迭代结果时不会返回该条目


无论tblguardians是否有关联的结果,是否有方法从tblcases返回字段?我想我已经读了太多的谷歌网页,想了解更多的信息

在WHERE子句中的联接表上添加一个条件可以有效地使该联接成为内部联接。 要避免这样做,您必须将第二个条件添加到左侧联接:

 SELECT cs.case_id, cs.child_firstname, gu.*
   FROM tblcases cs 

        LEFT JOIN tblguardians gu
        ON cs.case_id = gu.case_id 
    AND gu.firstname LIKE '%sally%' /* <- this line was moved up from WHERE */

  WHERE cs.child_firstname = '%craig%' 

你在过滤顾;如果tblguardians表中没有条目,则没有与WHERE子句匹配的结果

您必须稍微重新构造查询。在WHERE子句中放置条件将始终删除整行。由于左联接,tblguardians条目可以为null,因此在不删除整行的情况下,无法与其中的firstname列进行比较

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 '%sally%'
WHERE cs.child_firstname = '%craig%'
因为即使TBLGuardian中没有匹配项,您也希望得到结果,所以需要将该表上的条件移动到JOIN中的on子句。这将只从该表中删除设置为NULL的行结果,而不是整行

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 '%sally%'
WHERE cs.child_firstname = '%craig%'

左JOIN语句只允许在右空白列中显示结果。如果要同时显示两个空白列,则应使用完全外部联接。所以,使用该方法,您将有左侧和右侧的空白列

SELECT cs.case_id, cs.child_firstname, gu.*
FROM tblcases AS cs 
FULL OUTER JOIN tblguardians AS gu
ON cs.case_id = gu.case_id 
WHERE cs.child_firstname = '%craig%' AND gu.firstname LIKE '%sally%'

回答得很好,非常感谢。进一步修改,以满足我的需要,但把我完全放在正确的轨道上。同样好的答案与相同的SQL和张贴在同一时间。如果可能的话,将被接受为第二个答案!