SQL用于检索具有多对多关系的相关记录

时间:2014-01-12 13:12:52

标签: mysql normalization

我正在建立一个机构之间协议登记申请。这些协议可能包括2个以上的合作伙伴。因此,我很快就放弃了在合同表中使用part1和partner2的想法。

目前的设计是(注:简化问题):

Table Institutes: ID, Name , ..

Table Contract_institutes: ContractID, InstituteID

Table Contracts: ID, Title, ...

如果您认识一个合作伙伴,我将如何展示所有合同的清单,包括相关合作伙伴:用户已登录,并希望查看其所在机构的所有合同以及合同中的所有合作伙伴; e.g:

  • Contract1 :(标题)Institute1Name,Institute2Name
  • Contract2 :(标题)Institute1Name,Institute2Name,Institute3Name
  • Contract3 :(标题)Institute1Name

我可以先获得所有合同ID

select *fields* 
from Contracts
  left join Contract_institutes on Contracts.ID = Contract_institutes.ContractID
  where  Contract_institutes.InstituteID = *SomeValue*

然后让所有相关机构对每个合同进行单独查询(或者在查询中使用IN语句),并使用大量foreach php循环进行格式化。不漂亮,可能效率不高。

必须有更好的方法来执行此操作,并在单个sql语句中获取列表。有人能帮我吗?

理想情况下,我得到输出行:[合同ID] [InstituteID] [Institute.Name]。我可以在输出中的每个合约视图中轻松修改它。

PS: - 这是应用程序的设计阶段:数据库为空,可以根据需要进行修改。

1 个答案:

答案 0 :(得分:1)

select C.ID, I.ID, I.Name
from Contracts C 
  join Contract_institutes CI on C.ID = CI.ContractID
  join Institutes I on I.ID=CI.InstituteId
where CI.InstituteID <> *SomeValue*
    and CI.ContractID in (select CI2.ContractId 
        from Contract_institutes CI2
        where CI2.InstituteID = *SomeValue*)