php - MySQL加入3个级联表

标签 php mysql select join inner-join

我见过很多将多个表连接回一个主表的示例,但这个查询的不同之处在于它是级联的。

我有 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/

相关文章:

php - 如何避免一次做 5000 个查询?

php - 使用 JSON 提取 SQL 查询 - Codeigniter

mysql - 查询以选择在特定时间范围内注册的所有用户

php - 如何从PHP中的字符串中提取子字符串直到到达某个字符?

javascript - jquery 可嵌套不更新

MySQL - 多次将多行连接到单行

javascript - 按下按钮时传递值

oracle - Oracle是否等效于SQL Server STUFF函数?

mysql - 在一列中查找 N 个最大的元素

css - 选择箭头样式更改