我正在修改一个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页面,无法获取更多信息!
答案 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%'