2012-03-09 62 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