2015-06-13 2 views
1

Я пишу запрос, отображающий данные из нашей таблицы issues. У нас есть другая таблица, называемая labels, и таблица соединений, называемая issues_labels. Обычно мы назначаем проблему ярлыком «Высокий приоритет», «Средний приоритет» или «Низкий приоритет».Как отобразить поле, если запись существует в таблице соединений?

Я уверен, как написать мой запрос так бы вернуть этот результат:

Id   | Title     | Priority 
2   everything is broken  Low-Priority 
4   internets is down  High-Priority 

я писать запросы все время, но простота (или нет) этот сводит меня с ума. Нужно ли мне писать 3 подзапросов натянуть вопросы, которые связаны с каждой наклейке так:

with hp_issues as (
SELECT * 
FROM issues 
INNER JOIN issues_labels on issues_labels.issue_id = issue.id 
WHERE issues_labels.label_id = 10 --id for high priority issue 
) 
.... 

Любая помощь приветствуется.

ответ

2

Допуская issues_labels представляет собой таблицу, которая связывает проблемы и этикетки в многие-ко-многим ситуации, вы могли бы сделать:

select 
    i.id, 
    i.title, 
    l.priority 
from issues i 
left join issues_labels il on il.issues_id = i.id 
left join labels l on l.id = il.labels_id 

Пример: http://sqlfiddle.com/#!15/b78ee/1

по любой причине, если один из ваших вопросов, имеет более чем один приоритет, и вы хотите, чтобы это было опубликовано в

5 | Some title | High Priority, Low Priority

вы можете сделать:

select 
    i.id, 
    i.title, 
    string_agg(l.priority, ',') 
from issues i 
left join issues_labels il on il.issues_id = i.id 
left join labels l on l.id = il.labels_id 
group by 
    i.id, 
    i.title 

Это похоже на group_concat()

примера в MySQL для этого здесь: http://sqlfiddle.com/#!15/3dce4/2

+0

именно то, что я искал. Не знал о функции 'string_agg', очень полезен. – theartofbeing

0

Может ли проблема иметь только одну этикетку? Если это так, я думаю, что многие-ко-многим не нужны.

Однако, вы должны быть в состоянии сделать что-то вроде:

SELECT i.issueID, i.title, l.priority 
FROM issue AS i 
    LEFT JOIN issue_label as il on i.issueID = il.issueID 
    LEFT JOIN label as l on l.labelID = il.labelID 
WHERE issue_label = 10; 
Смежные вопросы