Postgres分组查询

时间:2012-11-09 20:23:09

标签: sql postgresql group-by

我试图在postgres的查询中使用group by。我无法按照我的意愿将其运行,以便根据需要对结果进行分组。

这是recursion queries I just had answered上另一个堆叠问题的扩展。但是现在我需要能够在最终查询的root_id列上对结果进行分组。以下是查询:

select cl.parent_comment_id, 
     cl.article_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
order by cl.root_id, cl.article_comment_id, cl.comment_depth;

我希望这样做,以便将具有相同parent_comment_id的任何记录保存在一起。

select cl.parent_comment_id, 
     cl.article_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
group by cl.parent_comment_id
order by cl.parent_comment_id, cl.article_comment_id, cl.comment_depth;

可以有许多记录返回相同的parent_comment_id,但是任何给定的article_comment_id都有不同的记录。即每个评论都是唯一的(id,评论,标题等),但每个家长评论可以有很多孩子。这已经被递归查询检索到了,现在我只是想正确地对它们进行分组。

编辑:


看看http://www.sqlfiddle.com/#!12/77771/2。我想要的是article_comment_id = 6紧跟在article_comment_id = 3下面,因为id = 3是父亲。然后article_comment_id = 4。

但我认为这需要在程序上完成。

所以我认为这是一个“没关系”的问题。问题类型,除非有人知道如何(这就是为什么我要放弃它)。但我想我会尝试在程序上解决这个问题。

1 个答案:

答案 0 :(得分:4)

对于递归查询,您可以使用带有0填充字符串的此技巧创建分层路径:SQL Fiddle

with recursive comment_list(article_comment_id, parent_comment_id, comment, article_id, comment_depth, comment_path) AS (
    select c.article_comment_id, 
           c.parent_comment_id, 
           c.comment, 
           c.article_id, 
           c.comment_depth,
           substr(CAST(1000000000+c.article_comment_id as varchar(1000)),2)
    from test_comment c
    where article_id = 100
      and parent_comment_id = 0

  union all

    select c.article_comment_id, 
           c.parent_comment_id, 
           c.comment, 
           c.article_id, 
           c.comment_depth,
           cl.comment_path || substr(CAST(1000000000+c.article_comment_id as varchar(1000)),2)
    from test_comment c
       join comment_list cl on c.parent_comment_id = cl.article_comment_id
)
select cl.article_comment_id,
     cl.comment_path, 
     cl.parent_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
order by cl.comment_path, cl.article_comment_id, cl.comment_depth;

删除GROUP BY。你想将它们“分组”以便显示,这实际上是“ORDER BY”

select cl.parent_comment_id, 
     cl.article_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
order by cl.parent_comment_id, cl.article_comment_id, cl.comment_depth;

您可能或可能不需要订单中的cl.root_id,因此可能

order by cl.root_id, cl.parent_comment_id, cl.article_comment_id, cl.comment_depth;