如果我有三张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
在那里)。
小提琴
4条答案
按热度按时间yiytaume1#
你确实有一个
LEFT JOIN relationships
在你的查询中,但是你也有一个INNER JOIN children
,这最终会阻止选择不匹配的行。请尝试以下操作:
fsi0uk1n2#
你的
inner join
在儿童桌上。试着用一个outer join
它将返回所有的父母。vfh0ocws3#
这是您的问题:
第一个
LEFT JOIN
可能找不到给定父级的匹配关系。当这种情况发生时,r.child_id
是NULL
. 显然没有对手INNER JOIN
,因此该行被过滤掉。这就是为什么
LEFT JOIN
铁链通常是用链子拴着的。一旦你有了一个,你就可以继续其他的了:brccelvz4#
通过用括号显式分组联接,可以获得所需的结果:
请注意
ON
合同条款LEFT JOIN
已经移到了最后。