2009-12-19 49 views
1

我有以下表格:如何結合2代或更多橋表在單個查詢

表:人(ID,第一個,最後,年齡,電話,等。)
表:角色(ID ,名)
表:技能(ID,姓名)
表:People_Roles(ID,PERSONID ^,角色ID ^)
表:People_Skills(ID,PERSONID ^,skillID ^)

^ = foreign key 

我基本上想要一個給我全部r的查詢所有人的角色和他們的技能。

Person.First,Person.Last,Roles.Name,Skills.Name

+0

這看起來像功課 – monksy 2009-12-19 16:21:33

+0

不幸的不是。 。現在我基本上正在運行很多查詢(每行一個),並且需要很長時間,所以我試圖將所有查詢合併到一個查詢中。 。 – leora 2009-12-19 16:25:09

+1

@monksy誰在乎它是否功課?問題是一個問題! – Twifty 2014-06-16 21:10:39

回答

3
SELECT p.first, p.last, r.name, s.name 
FROM People p 
LEFT JOIN People_Roles pr 
ON pr.personID = p.id 
INNER JOIN Roles r 
ON pr.roleID = r.id 
LEFT JOIN People_Skills ps 
ON ps.personID = p.id 
INNER JOIN Skills s 
ON ps.skillID = s.id 

此查詢將選擇所有的人,甚至是那些沒有Roles或分配Skills

+0

但如果我做所有內部加入,如果有一個人有技能,而不是一個角色,那麼它不會顯示記錄。我想看看所有的組合。我認爲這是一個外部連接? – leora 2009-12-19 16:23:48

+0

@oo我寫了一篇關於它的評論:)。爲您的樂趣更新了答案。 – Li0liQ 2009-12-19 16:27:53

+0

這仍然只給我行有技能或角色。如果有一個沒有技能或行的人,該怎麼辦。 。這將如何顯示? – leora 2009-12-19 16:47:47

0

這個查詢將工作:

SELECT Person.First, Person.Last, Roles.Name, Skills.Name 
FROM People 
    LEFT JOIN People_Skills 
     ON People.id = People_Skills.personID 
    INNER JOIN Skills 
     ON People_Skills.skillID = Skills.id 
    LEFT JOIN People_Roles 
     ON People.id = People_Roles.personID 
    INNER JOIN Roles 
     ON People_Roles.roleID = Skills.id 

順便說一句,爲什麼你的 「橋」 的表都有自己的ID。我只是使用由PersonID和相應的外鍵(skillsID或rolesID)組成的compound key來確保每對只能製作一次。

+0

但如果我做所有內部加入,如果有一個人有技能,而不是一個角色,那麼它不會顯示記錄。我想看看所有的組合。我認爲這是一個外部連接? – leora 2009-12-19 16:24:23

+0

確實,但你可能有許多行中有空值 – Oded 2009-12-19 16:27:50

+0

約定,但我想我需要在代碼中處理。 。或者返回到我的原始方法,即爲每個記錄在人員表中爲每個橋表建立一個單獨的查詢。 。 – leora 2009-12-19 16:28:39