繁体   English   中英

没有子查询的LEFT JOIN 2 INNER JOIN表

[英]LEFT JOIN 2 INNER JOIN Tables Without Subquery

我有3个表:作业,用户,应用程序。

我想要一个所有作业的列表,以及每个作业可能提交的“任何”应用程序的列表,但前提是我有提交该应用程序的用户的数据。

我隐约记得曾经看到过一些晦涩的语法,其中2个表联接到查询中,就好像是一个表一样,类似于:

select j.title, a.id, u.name from jobs j
left join applications a join users u on a.job_id=j.id and a.user_id = u.id

我知道我可以使用子查询来完成此操作,但是是否存在这种性质的语法?

更新资料

到目前为止,我收到的答案都假设我只需要基本的加入。 尽管它们破坏了问题中所要提出的逻辑。 也许我应该发布等效的子查询来说明我要运行的查询的类型。

select j.job_id, au.application_id, au.user_id from jobs j
left join (
select a.job_id, u.user_id from applications a
join users u on u.user_id = a.user_id
) au on j.job_id = au.job_id

您快要在那里了,您唯一的错误是将第二个连接条件放在第二个连接之后。

select * 
from jobs j
left join application a on on.job_id = j.id
left join users u on u.user_id = u.id

请注意,一个联接中可以引用的表的最大数量为61(在MySQL中,并且可能是大多数流行的DBMS)。

请参阅文档

如果以“简单”方式将它们链接起来,则需要将它们都作为外部联接:

select * 
from jobs j
left outer join application a on a.job_id = j.id
left outer join users u on u.user_id = a.id

由于我认为应用程序需要用户,因此您可以以这种方式强制首先进行内部联接。 也许这就是您要询问的语法问题。 在我的经验中,括号通常是可选的,但我对MySQL并不了解:

select * 
from jobs j
left outer join (application a
inner join users u on a.user_id = u.id) on a.job_id = j.id

有时会在此处出现右连接,因此查询可以从上到下进行编写而无需嵌套:

select * 
from application a 
inner join users u on u.user_id = a.id on 
right outer join jobs j on a.job_id = j.id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM