小编典典

Postgres按查询分组

sql

我正在尝试在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。

但是,我认为这需要按程序进行。

因此,我认为这是一个“没关系”的问题,除非有人知道如何做(这就是为什么我放弃它)。但是我想我将尝试在程序上解决这一部分。


阅读 236

收藏
2021-04-28

共1个答案

小编典典

对于递归查询,您可以使用带有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;
2021-04-28