2017-01-09 137 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 *內部字段的搜索功能的一部分,但需要從兩個父表中捕獲數據以顯示相關信息。 –