我有 3 个主表:Person,Publication和Conference
和 2 个多对多链接表:person_publication和person_conference
我想将所有 3 个主表连接在一起(向我展示一个人参与的所有出版物和会议)
但到目前为止,我只能像这样查询个人对出版物或个人对会议:
select person.*, publication.*
from person
left join person_publication on person_publication.person_id = person.id
left join publication on person_publication.publication_id = publication.id;
select person.*, conference.*
from person
left join person_conference on person_conference.person_id = person.id
left join conference on person_conference.conference_id = conference.id;
Run Code Online (Sandbox Code Playgroud)
我怎样才能把他们全部加入?
加入conference到person_conference,从 中选择人员键person_conference。对publication和做同样的事情person_publication。在 from 子句中进行两个查询子查询,并在person键上连接这两个查询。
编辑:
你会想要做这样的事情:
SELECT
p.person_id,
p.name,
a.conference,
b.publication
FROM
person AS p
LEFT JOIN (SELECT
pc.person_id,
c.conference
FROM
person_conference AS pc
INNER JOIN conference AS c
ON pc.conference_id = c.conference_id) AS a
ON p.person_id = a.person_id
LEFT JOIN (SELECT
pp.person_id,
ppp.publication
FROM
person_publication AS pp
INNER JOIN publication AS ppp
ON pp.publication_id = ppp.publication_id) AS b
ON p.person_id = b.person_id
Run Code Online (Sandbox Code Playgroud)
内部查询称为子查询。这些将充当“表”(它们不相同),然后您可以对其进行查询。但是,如果您打算将子查询用作“表”,则确实需要使用AS关键字对它们进行别名。
编辑:
自 2014 年以来,我学到了很多东西,上面的查询表明了这一点。我将其作为给出答案的参考,但以下将是一个更好的查询:
SELECT per.person_id,
per.name,
conf.conference,
pub.publication
FROM person AS per
LEFT JOIN person_conference AS pconf
ON per.person_id = pconf.person_id
LEFT JOIN conference AS conf
ON pconf.conference_id = conf.conference_id
LEFT JOIN person_publication AS ppub
ON per.person_id = ppub.person_id
LEFT JOIN publication AS pub
ON ppub.publication_id = pub.publication_id
Run Code Online (Sandbox Code Playgroud)