Sql 我怎么能';水平化';我的第一个查询中的第二个查询?

Sql 我怎么能';水平化';我的第一个查询中的第二个查询?,sql,postgresql,Sql,Postgresql,我有一个问题可以用一个很像SO的系统来模拟:posts和tags。为了得到我的帖子,我可能会这样做: SELECT title, body, author FROM posts WHERE id = ? 然后很简单地得到我的标签 SELECT tag_id FROM tags_on_posts WHERE post_id = ? 比如说,我有一个限制,就像这样,每个帖子只能有5个标签。我是否可以在单个查询中执行此操作 SELECT title, body, author, tag1, tag

我有一个问题可以用一个很像SO的系统来模拟:posts和tags。为了得到我的帖子,我可能会这样做:

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 = ?

您可以将标记聚合为字符串,并在应用程序端拆分它们

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

它们可能很痛苦,但非常有用。我忽略了特定于数据库的标记。我在研究博士后。现在我知道了“支点”这个词,我刚刚开辟了一条新的研究途径。啊,我希望这些途径能有所帮助。如果你知道它将永远是5。。。您可以使用临时表来构造两个中间表,然后将它们合并到最后一个中间表中。我的回答
string\u Agg
中的几个修复程序也使用第二个参数作为分隔符,如果标签中有黑名单中的字符,这可能是一个很好的解决方案。@Admiral谢谢。修正如果我每个忘记的参数都有25美分,我就可以把欠我的苏打水还清到附近的冰箱里。什么是“分组方式1,2,3”-我得到分组方式,但这里的1,2,3到底是什么?@corsiKa在选择列表中按顺序排列列。