2

我正在尝试在 postgres 的查询中使用 group by。我无法让它按我的意愿工作,以便根据需要对结果进行分组。

这是我刚刚回答的关于递归查询的另一个堆栈问题的扩展。但现在我需要能够对最终查询的 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。

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

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

4

1 回答 1

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;
于 2012-11-09T20:27:34.513 回答