2012-03-09 61 views
1

我想建立一個輸出爲這樣:SQL連接兩個表之間的聯繫表 - 格姆/ Grails的

Name source source source 
Tim Other TV  Radio 

,我想一個人表和源表結合:

Person 
ID Name 
1 Tim 

Source 
ID Name 
1 Other 
2 TV 
3 Radio 

Person_Source 
p_id s_id 
1  1 
1  2 

我有一個查詢,建立出來的時間和輸出多個行的每個來源。我在尋找一個結果在結果集中

select source.name 
from person left join person_source 
on person_source.person_source_id = person.id join source 
on source.id = person_source.source_id 
+0

爲什麼你的輸出顯示「Radio」?似乎PERSON_SOURCE在您的示例數據中沒有相應的記錄。 – Marc 2012-03-09 03:25:58

回答

3

你可以添加一個DISTINCT到查詢:

select DISTINCT source.name 
from person left join person_source 
on person_source.person_source_id = person.id join source 
on source.id = person_source.source_id 
+0

這給了我使用我的結果集和處理數據的能力。謝謝! – user82302124 2012-03-09 16:21:59

2

不知道是什麼味道的SQL這應該是,但你可以嘗試以下:

SELECT 
    p.Name, 
    MAX(CASE s.ID WHEN 1 THEN s.Name END) AS source1, 
    MAX(CASE s.ID WHEN 2 THEN s.Name END) AS source2, 
    MAX(CASE s.ID WHEN 3 THEN s.Name END) AS source3 
FROM Person p 
    INNER JOIN Person_Source ps ON p.ID = ps.p_id 
    INNER JOIN Source s ON ps.s_id = s.ID 
GROUP BY 
    p.ID, 
    p.Name 

你也可以查看源不同,使用他們的名字,像這樣:

… 
    MAX(CASE s.Name WHEN 'TV' THEN s.Name END) AS source1, 
    MAX(CASE s.Name WHEN 'Radio' THEN s.Name END) AS source2, 
    MAX(CASE s.Name WHEN 'Other' THEN s.Name END) AS source3 
… 

請注意,SQL查詢總是返回固定數量的列。您需要事先決定查詢返回多少個數據源,如果數字取決於Source表中可能的來源的實際數量,則必須動態構建查詢以包含所有必要的數據來源但不超過必要。

+0

對此代碼使用mysql – user82302124 2012-03-09 14:16:11