我正在尝试在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。
但是,我认为这需要按程序进行。
因此,我认为这是一个“没关系”的问题,除非有人知道如何做(这就是为什么我放弃它)。但是我想我将尝试在程序上解决这一部分。
对于递归查询,您可以使用带有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按顺序排序,所以可能是
cl.root_id
order by cl.root_id, cl.parent_comment_id, cl.article_comment_id, cl.comment_depth;