假设我有 2 个表。
Nav:
-----------
id INT NOT NULL,
title VARCHAR(50) NOT NULL,
target_page INT DEFAULT NULL;
Pages:
-----------
id INT NOT NULL,
url VARCHAR(200) NOT NULL,
access_level INT NOT NULL;
请注意 Nav 中的 target_page 可以为 NULL。 如果我想在从 Nav 选择数据的同时从 Pages 获取 url,我可以使用内部连接:
SELECT Nav.id, Nav.title, Pages.url FROM Nav
INNER JOIN Pages ON Pages.id = Nav.target_page
如果我想添加一个额外的条件,比如系统的当前用户只能看到他们有权访问的页面,我可以添加一个额外的条件:
SELECT Nav.id, Nav.title, Pages.url FROM Nav
INNER JOIN Pages ON Pages.id = Nav.target_page
WHERE Pages.access_level <= OurImaginaryUserLevel
Inner Join 确保用户没有从 Nav 返回的行链接到页面中 access_level 大于用户的记录。
但是,Nav 中的某些记录的 target_page 为 NULL。我想返回这些记录,即使 INNER JOIN 阻止返回它们,因为页面中没有 ID 为 NULL 的记录。
只有 target_page 为 NULL 的记录才能免于 INNER JOIN。 target_page 为 Not NULL 的记录只有在 Pages 表中存在匹配且满足 Pages.access_level 条件时才应返回,因此我不能使用 Left Join。
如果我的要求难以理解,我深表歉意。如有任何问题,请随时提出。
提前致谢
最佳答案
我认为您误解了 LEFT JOIN
- 在您的情况下,您可以将 INNER JOIN
替换为 LEFT JOIN
并获得相同的结果结果!
为了实现您想要的效果,您实际上需要使用它,因为您也喜欢从 Nav
中检索没有 target_page
的行:
SELECT Nav.id, Nav.title, Pages.url FROM Nav
LEFT JOIN Pages ON Pages.id = Nav.target_page
WHERE Pages.access_level <= 1 OR target_page IS NULL
演示:http://sqlfiddle.com/#!2/69ed06/1
如您所见,这将返回具有 1 级页面和没有任何页面关联的导航。
关于mysql - SQL 条件内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23143421/