MySQL LEFT JOIN - 值可以为NULL

时间:2012-03-07 19:25:44

标签: mysql sql join

我正在修改一个MySQL语句,但在LEFT JOIN和空行时遇到了一些麻烦。目前我有:

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”表中有条目,此查询就可以正常工作,但如果没有记录,则LEFT JOIN返回NULL - 因此,当我在PHP中迭代结果时,不返回该条目。 / p>

是否有办法从“tblcases”返回字段,无论“tblguardians”是否有相关结果?我想我已经阅读了太多的Google页面,无法获取更多信息!

4 个答案:

答案 0 :(得分:10)

在WHERE子句中的连接表上设置条件有效地使加入INNER JOIN 为避免这样做,您必须将第二个条件添加到LEFT JOIN:

 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%' 

答案 1 :(得分:4)

您必须稍微重新构建查询。在WHERE子句中添加条件将始终删除整行。由于LEFT JOIN导致tblguardians条目可以为空,因此无法在不删除整行的情况下与其中的firstname列进行比较。

由于即使tblguardians中没有匹配项也需要结果,因此您需要将该表上的条件移至ON中的JOIN子句。这只会从该表中删除(设置为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%'

答案 2 :(得分:1)

您正在过滤gu;如果tblguardians表中没有条目,则没有结果与WHERE子句匹配。

答案 3 :(得分:0)

LEFT JOIN语句允许仅显示右空白列的结果。如果要显示两个空白列,则应使用FULL OUTER 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%'