我的问题与我的(旧的且成功回答的)问题有些相关: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”。
我再次认为这可以通过递归注释来解决,但是“冒泡树”而不是从根开始。但这一次,我什至无法找到如何表达我的查询的起点。
任何帮助将不胜感激!预先感谢您花时间阅读我的问题描述!
从目标行开始,继续抓取所有非
'node'
。一旦遇到 cte.entity_type='node'
,递归就会停止,并且在外部查询中,您所要求的正是那个: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 的节点的初始评论 |