2015-06-13 59 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 

這類似於MySQL的group_concat()

示例將是在這裏: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; 
相關問題