给定 2 个多对多关系表,如何将 3 个表连接在一起?

use*_*923 3 mysql join

我有 3 个主表:Person,PublicationConference

和 2 个多对多链接表:person_publicationperson_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)

我怎样才能把他们全部加入?

JRL*_*ert 7

加入conferenceperson_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)