SQL条件内连接

时间:2014-04-17 21:04:12

标签: mysql sql join

说我有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的Pages中没有记录。

只有target_page为NULL的记录才能免于INNER JOIN。只有在Pages表中存在匹配并且满足Pages.access_level条件时,才应返回target_page为Not NULL的记录,因此我不能使用Left Join。

如果我的要求难以理解,我道歉。随意提出更多问题。

提前致谢

1 个答案:

答案 0 :(得分:3)

我认为您误解了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级页面的导航和没有任何页面关联的导航。