我试图在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。
但我认为这需要在程序上完成。
所以我认为这是一个“没关系”的问题。问题类型,除非有人知道如何(这就是为什么我要放弃它)。但我想我会尝试在程序上解决这个问题。
答案 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;