2014-01-12 51 views
0

我建立了机构之间的协议的注册申请。这些协议可能包括2个以上的合作伙伴。因此,我很快放弃了将part1和partner2放在合同表中的想法。SQL检索与许多相关记录,以一对多的关系

当前设计(注:简化了问题):

Table Institutes: ID, Name , .. 

Table Contract_institutes: ContractID, InstituteID 

Table Contracts: ID, Title, ... 

我怎么会去展示的所有合同,包括所涉及的合作伙伴名单,假设你知道一个合作伙伴:用户已登录,并希望看到他的研究所拥有的所有合同以及合同中的所有合作伙伴;例如:

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

我可以先获得所有合同编号

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

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

必须有一个更好的方式来做到这一点,并在一个SQL语句获取列表。有人能帮我吗?

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

PS: - 这是应用程序的设计阶段:数据库是空的,并且可以被修改,以需求。

回答

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