mysql - SQL 条件内连接

标签 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 的记录。

只有 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/

相关文章:

mysql - 具有唯一键约束的数据库中的重复行

mysql - 按日期检索每组中的最后一条记录 - MySQL

mysql - 使用 SQL 脚本和事务管理 mysql 模式更改

sql - 使用内联查询或连接从另一个表中获取数据?

sql - 如何在 Redshift 中使用两个不同的分隔符拆分两列中的数据?

mysql - 如何对来自不同表的汇总列进行分组?

php - 将加权平均值添加到返回的mysql查询并将所有数据相加

php - 无法获取sql中所有相似行的总和

sql - SQL错误(缺少运算符)查询操作中的错误

mysql - 连接两个选择查询并对结果进行排序