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

Mysql SQL检索具有多对多关系的相关记录,mysql,normalization,Mysql,Normalization,我正在申请机构间协议的注册。这些协议可能包括两个以上的合作伙伴。因此,我很快放弃了将part1和partner2放在合同表中的想法 当前设计注:问题简化: Table Institutes: ID, Name , .. Table Contract_institutes: ContractID, InstituteID Table Contracts: ID, Title, ... 假设您认识一个合作伙伴,我将如何显示包括相关合作伙伴在内的所有合同的列表:一个用户已登录,希望查看其机构拥有

我正在申请机构间协议的注册。这些协议可能包括两个以上的合作伙伴。因此,我很快放弃了将part1和partner2放在合同表中的想法

当前设计注:问题简化:

Table Institutes: ID, Name , ..

Table Contract_institutes: ContractID, InstituteID

Table Contracts: ID, Title, ...
假设您认识一个合作伙伴,我将如何显示包括相关合作伙伴在内的所有合同的列表:一个用户已登录,希望查看其机构拥有的所有合同以及合同中的所有合作伙伴;e、 g:

合同1:名称机构名称,机构名称 合同2:名称机构名称、机构名称、机构名称 合同3:产权机构名称 我可以先拿到所有的合同ID

select *fields* 
from Contracts
  left join Contract_institutes on Contracts.ID = Contract_institutes.ContractID
  where  Contract_institutes.InstituteID = *SomeValue*
然后通过对每个合同的单独查询或在查询中使用IN语句获取所有相关机构,并使用大量foreach php循环进行格式化。不漂亮,可能效率也不高

必须有更好的方法来实现这一点,并在单个sql语句中获取列表。有人能帮我吗

理想情况下,我使用:[contract ID][InstituteID][Institute.Name]获取输出行。我可以在输出中的每个合同视图中轻松地修改它

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

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*)