【问题标题】:PostgreSQL check parent of parent in queryPostgreSQL在查询中检查父级的父级
【发布时间】:2020-09-17 13:21:48
【问题描述】:

好的,我会尽量做到准确。我有一个带有 parent_comment_id 的 cmets 的数据库。我想从这个表中选择一些 cmets 以及这些 cmets 的匹配数量的答案。我的问题来了:如果我随意选择cmets,我可能会抓住一些没有任何答案的人。但是,如果我先选择评论答案,我可能会抓取已经是另一个评论答案的答案。所以,我想做的是获取评论的即时答案(parent_comment_id = NULL),然后根据 parent_comment_id 获取这些 cmets。我将如何在查询中解决这个问题?

假设数据库的这种布局

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
...

现在,我会选择 2 个答案和相应的 cmets。如果我只选择前 2 个答案,我会得到评论 3 和 4,但如果我回溯这些,我只会得到评论 1,因为评论 4 是对答案的回答。相反,我只想找到其父评论没有父评论的 cmets,在此示例中为评论 3 和 5。

我并没有真正尝试过任何事情,只是意识到如果不以某种方式递归获取父母,我不知道如何在 SQL 查询中执行此操作。

【问题讨论】:

  • 请提供样本数据和所需结果以阐明您的要求。另外,你有没有尝试过这方面的任何事情?

标签: sql database postgresql join recursive-query


【解决方案1】:

我用一个非常简单的解决方案解决了这个问题。可能是可怕的做法,但适用于我的用例^^

对于给定的示例,它将是这样的:

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

【讨论】:

    【解决方案2】:

    我只想找到父评论没有父评论的 cmets。

    我认为你只想要一个自加入和一些过滤:

    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
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-06
      • 2012-01-22
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多