为什么二级INNER JOIN限制结果

时间:2018-12-11 22:10:46

标签: mysql sql

如果我有三个表,就像这样:

父母

| 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)。

Fiddle

4 个答案:

答案 0 :(得分:2)

这是您的查询:

StringIO.StringIO

第一个six可能找不到给定父级的匹配关系。发生这种情况时,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_id没有匹配项,因此该行被过滤掉了。

这就是NULL通常被链接的原因。一旦拥有一个,就继续其他:

INNER JOIN

答案 1 :(得分:1)

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

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的{​​{1}}子句已移到末尾。

答案 2 :(得分:0)

您的查询中确实有一个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;

答案 3 :(得分:0)

您的inner join在子表中。使用outer join进行尝试,它将返回所有的父母。