postgresql检查查询中父项的父项

q3aa0525  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(408)

好吧,我会尽量精确的。我有一个数据库,其中包含具有父注解id的注解。我想从该表中选择一些注解以及与这些注解匹配的答案。我的问题来了:如果我任意选择评论,我可能会抓住一些没有任何答案的人。但是,如果我先选择评论答案,我可能会抓取已经是另一个评论答案的答案。所以,我要做的是抓取对某个注解(parent\u comment\u id=null)的即时答案,然后根据parent\u comment\u id获取这些注解。在查询中如何处理这个问题?
假设数据库的这种布局

comment_id    parent_comment_id
1             NULL
2             NULL
3             1
4             3
5             1
6             3
7             1
8             4
9             NULL
10            NULL
...

现在,我来选择两个答案和相应的评论。如果我只选择前两个答案,我会得到评论3和4,但如果我回溯这些,我只会得到评论1,因为评论4是一个答案的答案。相反,我只想找到父注解没有父注解的注解,在本例中是注解3和注解5。
我真的没有尝试过任何东西,只是意识到如果不以某种方式递归地获取父级(我不知道如何在sql查询中这样做),它是行不通的。

pbpqsu0x

pbpqsu0x1#

我用一个很简单的方法解决了这个问题。可能是可怕的做法,但适用于我的用例^^
对于给定的示例,它是这样的:

select distinct on (parent_comment_id) c.id, c.parent_comment_id, c.text
from comments c
where parent_comment_id is not null
and (select parent_comment_id from comments p where id = c.parent_comment_id) is null
kr98yfug

kr98yfug2#

我只想找到父注解没有父注解的注解。
我认为您只需要一个自连接和一些过滤:

select c.*
from comments c
inner join comments pc on pc.comment_id = c.parent_comment_id
where pc.parent_comment_id is null

你也可以用 exists :

select c.*
from comments c
where exists (
    select 1 
    from comments pc 
    where pc.comment_id = c.parent_comment_id and pc.parent_comment_id is null
)

相关问题