2014-06-19 154 views
1

我有一個問題,可以用一個類似於SO的系統來模擬:帖子和標籤。爲了讓我的帖子,我可能會做這樣的事情:如何將第二個查詢「水平化」到我的第一個查詢中?

SELECT title, body, author FROM posts WHERE id = ? 

,然後讓我的標籤非常簡單

SELECT tag_id FROM tags_on_posts WHERE post_id = ? 

比方說,我有個限度,像這樣做,你只能每5個標籤帖子。無論如何,我可以在單個查詢中做到這一點?

SELECT title, body, author, tag1, tag2, tag3, tag4, tag5 
    FROM posts 
    JOIN /*help*/ 
    WHERE id = ? 
+0

[你有沒有試過SQL Pivot?](http://technet.microsoft.com/en-us/library/ms177410(v = sql.105).aspx),它們可能很痛苦,但是非常有用。 [你也可以動態與他們](http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) – TheNorthWes

+0

我忽略了我的數據庫特定的標記。我正在研究Postgres。現在我知道術語PIVOT,我剛開闢了一條新的研究大道。 – corsiKa

+0

啊,好吧,我希望這些途徑有所幫助。如果你知道它總是5 ...你可以使用臨時表來構造兩個中間表,然後將它們合併到第三個中間表中。 – TheNorthWes

回答

2

可以聚集標籤轉換成字符串,並將其在應用端

select 
    title, body, author, 
    string_agg(tag_id, ',') as tag_ids 
from 
    posts p 
    inner join 
    tags_on_posts top on p.id = top.post_id 
where p.id = ? 
group by 1, 2, 3 

分裂如果標籤名稱是在第三個表

select 
    title, body, author, 
    string_agg(tag_name, ',') as tag_names 
from 
    posts p 
    inner join 
    tags_on_posts top on p.id = top.post_id 
    inner join 
    tags t on t.id = top.tag_id 
where p.id = ? 
group by 1, 2, 3 
+0

'string_Agg'另外還有一個參數作爲分隔符,如果存在從標記列出的黑色字符,這可能是一個很好的解決方案。 – TheNorthWes

+0

@Admiral謝謝。固定 –

+0

如果我有一個四分之一的每一個被遺忘的參數,我都可以把我的蘇打債務還給這裏的冰箱。 – TheNorthWes

相關問題