2014-06-19 153 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

相关问题