2012-03-09 3 views
1

Я пытаюсь построить вывод, как, например:SQL объединить две таблицы с таблицей связи между - Горм/Grails

Name source source source 
Tim Other TV  Radio 

Где я хочу объединить таблицу Person и таблицу Источник:

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

Почему ваш желаемый выход показывает «Радио»? Не похоже, что PERSON_SOURCE имеет соответствующую запись в ваших данных образца. – Marc

ответ

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

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

Смежные вопросы