如果我有三个表,就像这样:
父母
| 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
)。
答案 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
进行尝试,它将返回所有的父母。