2017-01-09 143 views
1

我已经看到很多示例将多个表连接回一个主表,但这个查询不同之处在于级联。MySQL加入3个级联表

我有3个表类似于下面的(简化为便于):

**CONTACTS**  
-------------------------------------------- 
Cid name 
-------------------------------------------- 
1  John 
2  Peter 
3  Karl 


**OPPORTUNITIES** 
-------------------------------------------- 
Oid Cidlink title 
-------------------------------------------- 
1  2   php lookup script 
2  2   php facial recognition 
3  3   html email template 
4  1   javascript verification 

**ATTACHMENTS** 
-------------------------------------------- 
Aid Oidlink attachment 
-------------------------------------------- 
1  3   received enquiry 
2  3   header and footer done 
3  3   pixel trace image done on server 
4  2   database structure done  
5  2   html get form done 

正如你所看到的,附件链接回的机会和机遇涉及到的联系人。除了通过商机表以外,附件不直接链接到联系人。

我需要创建一个记录集,包括所有3个表中的字段,并且挣扎着。

SELECT CONTACTS.*, OPPORTUNITIES.*, ATTACHMENTS.* 
FROM ATTACHMENTS 
    INNER JOIN OPPORTUNITIES 
     ON CONTACTS.Cid = OPPORTUNITIES.Cidlink 
    INNER JOIN ATTACHMENTS 
     ON OPPORTUNITIES.Oid = ATTACHMENTS.Oidlink 

ORDER BY ****whatever**** 

我结束了还是我接近这个错误的方式?

+0

为什么你有附件列出两次?第一个人不应该是“联系人”吗? (是的,这是关闭假设一个记录必须在所有3个表中,你需要它。)否则你需要使用OUTER连接。 – xQbert

+0

如果您不使用LEFT加入,John将被排除在外,因为他没有附件机会。通过使用LEFT Join,你可以包括John的机会,没有附件。 (请注意,在这些问题中发布预期结果有助于我们更好地理解您的想法,并考虑在未来发布的信息中包含预期结果!)它有助于说明您试图达成的目标。 – xQbert

回答

0

我想你的意思是在交往中是第一个表中没有附件...

SELECT CONTACTS.*, OPPORTUNITIES.*, ATTACHMENTS.* 
FROM ATTACHMENTS --- This is wrong 
INNER JOIN OPPORTUNITIES 
    ON CONTACTS.Cid = OPPORTUNITIES.Cidlink 
INNER JOIN ATTACHMENTS 
    ON OPPORTUNITIES.Oid = ATTACHMENTS.Oidlink 
ORDER BY ****whatever**** 

我想你的意思(与使用别名更容易阅读,从长远来看)

SELECT C.*, O.*, A.* 
FROM Contacts C 
INNER JOIN OPPORTUNITIES O 
    ON C.Cid = O.Cidlink 
INNER JOIN ATTACHMENTS A 
    ON O.Oid = A.Oidlink 
ORDER BY ****whatever**** 

既然你表示你需要所有3个表中的字段,我假设INNER JOIN在这里是合适的;但也许你想要使用OUTER JOIN来包含所有联系人? 包含所有联系人及其机会(如果存在)。 并包括所有的机会,如果附件如果存在的话)

SELECT C.*, O.*, A.* 
FROM Contacts C 
LEFT JOIN OPPORTUNITIES O 
    ON C.Cid = O.Cidlink 
LEFT JOIN ATTACHMENTS A 
    ON O.Oid = A.Oidlink 
ORDER BY ****whatever**** 

为了更好地理解的加入从CodingHorror这Venn Diagram的做法是一个良好的开端。

+0

谢谢xQbert - 我会试试看。 –

+0

完美 - 愚蠢的错误 - 这是一种享受。谢谢。 –

+0

并非所有的联系人都是必需的,也不是所有的机会。我将此作为A *内部字段的搜索功能的一部分,但需要从两个父表中捕获数据以显示相关信息。 –