PostgreSQL 中的“向后递归”查询?

问题描述 投票:0回答:1

我的问题与我的(旧的且成功回答的)问题有些相关:PostgreSQL 中的递归计数查询。现在,我面临着一个有点类似的问题,实际上我不确定是否有答案。所以,和上次一样,我希望你们能救救我! :-)

新任务:

我需要确定已发布评论的根实体 ID。正如我之前的问题一样,表结构是相同的。但现在,我遇到了一个评论 ID (cid),我必须确定它所属节点的实体 ID。

最简单的情况是,给定的评论 ID 已经包含其表行中的节点 ID,因此我只需查看直观的信息即可确定根实体 ID。

当提供的评论 ID 属于一条评论时,它会变得复杂,该评论已作为对另一条评论的回复而发布。同样,最简单的情况是,所引用的评论已经是“1 级”评论并且包含根实体 ID。但它变得非常混乱,因为评论可以发布到“评论树”的任一级别。

表结构:

西德 实体类型 实体_id 评论
1 节点 1 对 id 为 1 的节点的初始评论
2 评论 1 回复ID为1的评论
3 评论 2 回复ID为2的评论
4 评论 1 第一条评论的第二次回复
5 节点 2 评论另一个节点
6 节点 1 节点 1 上的第二个直接子评论
7 节点 3 对第三个节点发表评论

节点本身不是该表的一部分。上面数据的可视化层次结构是

node with id 1
 |- (cid: 1) initial comment on node with id 1
 |   |- (cid: 2) reply to comment with id 1
 |   |   |- (cid: 3) reply to comment with id 2
 |   |- (cid: 4) second reply on first comment
 |- (cid: 6) second direct child comment on node 1
node with id 2
 |- (cid: 5) comment on another node
node with id 3
 |- (cid: 7) comment on a third node
 

例如,我需要确定所提供的 cid“3”的节点 ID。正如我上一个问题中的表所示,ID 为 3 的评论是对 ID 2 的评论的回答,而 ID 2 本身又是对 ID 为 1 的评论的回答,该评论在其行中保存根实体 ID“1”,因为此评论是在节点上发布的,而不是评论。此示例的结果将为“1”。

我再次认为这可以通过递归注释来解决,但是“冒泡树”而不是从根开始。但这一次,我什至无法找到如何表达我的查询的起点。

任何帮助将不胜感激!预先感谢您花时间阅读我的问题描述!

sql postgresql recursion recursive-query
1个回答
0
投票

从目标行开始,继续抓取所有非

'node'
。一旦遇到
cte.entity_type='node'
,递归就会停止,并且在外部查询中,您所要求的正是那个:
db<>fiddle 的演示

prepare get_root_node_of_foo(int) as
with recursive cte as(
  select*
  from foo
  where cid = $1
   union all
  select foo.* 
  from cte
  join foo on cte.entity_id=foo.cid
  where 'node' <> cte.entity_type)
select*from cte
where entity_type='node';
execute get_root_node_of_foo(3);
西德 实体类型 实体_id 评论
1 节点 1 对 id 为 1 的节点的初始评论
© www.soinside.com 2019 - 2024. All rights reserved.