我见过很多将多个表连接回一个主表的示例,但这个查询的不同之处在于它是级联的。
我有 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****
我是接近还是以错误的方式接近它?
最佳答案
我想你的意思是让联系人成为第一个表而不是附件......
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****
为了更好地理解加入这个 Venn Diagram来自 CodingHorror 的方法是一个好的开始。
关于php - MySQL加入3个级联表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41551907/