2012-03-07 58 views
2

我正在修改一个MySQL语句,但有一些左连接和空白行的麻烦。目前,我有:MySQL左加入 - 值可以为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 
WHERE cs.child_firstname = '%craig%' AND gu.firstname LIKE '%sally%' 

此查询工作正常,只要没有在“tblguardians”表中的条目,但LEFT JOIN返回NULL,如果没有记录 - 因此不会返回入口当我迭代PHP中的结果时。

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

回答

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

很棒的答案,非常感谢。进一步修改以适应我的需求,但让我完全正确的轨道。 – 2012-03-07 20:16:23

1

你在gu过滤;如果tblguardians表中没有条目,则没有结果将与该WHERE条款匹配。

4

你必须稍微调整你的查询。将条件放在WHERE子句中将始终删除整行。由于tblguardians条目可能为空,因为LEFT JOIN,因此无法删除整行而无法与其中的firstname列进行比较。

既然你想要结果,即使在tblguardians中没有匹配,你也需要将你的条件移到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%' 
+0

同样的SQL同时回答并同时发布。如果可能的话,会被接受为第二个答案! – 2012-03-07 20:19:04

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