为什么二级内部连接会限制结果

fafcakar  于 2021-06-17  发布在  Mysql
关注(0)|答案(4)|浏览(323)

如果我有三张table,像这样:
父母

| id  | title    |
| --- | -------- |
| 1   | Parent 1 |
| 2   | Parent 2 |

关系

| parent_id | child_id |
| --------- | -------- |
| 1         | 1        |

儿童

| id  | title   |
| --- | ------- |
| 1   | Child 1 |

我运行以下查询:

SELECT parents.title, 
       relationships.child_id 
FROM   parents 
       LEFT JOIN relationships 
              ON parents.id = relationships.parent_id 
       INNER JOIN children 
               ON relationships.child_id = children.id;

为什么它会返回以下内容?

| title    | child_id |
| -------- | -------- |
| Parent 1 | 1        |

我希望它能回报所有的父母(因为 LEFT JOIN 只有在孩子存在的情况下才返回关系(因为有一个 INNER JOIN 在那里)。
小提琴

yiytaume

yiytaume1#

你确实有一个 LEFT JOIN relationships 在你的查询中,但是你也有一个 INNER JOIN children ,这最终会阻止选择不匹配的行。
请尝试以下操作:

SELECT parents.title, 
       relationships.child_id 
FROM   parents 
       LEFT JOIN relationships 
              ON parents.id = relationships.parent_id 
       LEFT JOIN children 
               ON relationships.child_id = children.id;
fsi0uk1n

fsi0uk1n2#

你的 inner join 在儿童桌上。试着用一个 outer join 它将返回所有的父母。

vfh0ocws

vfh0ocws3#

这是您的问题:

SELECT p.title, r.child_id 
FROM parents p LEFT JOIN
     relationships r
     ON p.id = r.parent_id INNER JOIN
     children c
     ON r.child_id = c.id;
--------^

第一个 LEFT JOIN 可能找不到给定父级的匹配关系。当这种情况发生时, r.child_idNULL . 显然没有对手 INNER JOIN ,因此该行被过滤掉。
这就是为什么 LEFT JOIN 铁链通常是用链子拴着的。一旦你有了一个,你就可以继续其他的了:

SELECT p.title, r.child_id 
FROM parents p LEFT JOIN
     relationships r
     ON p.id = r.parent_id LEFT JOIN
     children c
     ON r.child_id = c.id;
brccelvz

brccelvz4#

通过用括号显式分组联接,可以获得所需的结果:

SELECT parents.title, 
   relationships.child_id 
FROM   parents 
   LEFT JOIN (relationships 
              INNER JOIN children 
                  ON relationships.child_id = children.id)
       ON parents.id = relationships.parent_id

请注意 ON 合同条款 LEFT JOIN 已经移到了最后。

相关问题