PostgreSQL проверить родителя родителя в запросе - PullRequest
1 голос
/ 30 мая 2020

Хорошо, я постараюсь быть максимально точным. У меня есть база данных с комментариями, у которых есть parent_comment_id. Я хочу выбрать количество комментариев из этой таблицы и соответствующее количество ответов на эти комментарии. Вот и моя проблема: если я произвольно выберу комментарии, я могу схватить те, у кого нет ответов. Однако, если я сначала выберу ответы на комментарии, я могу получить ответы, которые уже являются ответом на другой комментарий. Итак, что я хочу сделать, так это получить ответы, которые являются немедленными ответами на комментарий (parent_comment_id = NULL), а затем получить эти комментарии на основе parent_comment_id. Как мне go сообщить об этом в запросе?

Предположим, что это макет базы данных

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 ответа и соответствующие комментарии. Если я просто выберу первые 2 ответа, я получу комментарии 3 и 4, но если я прослежу их, я получу только комментарий 1, потому что комментарий 4 является ответом на ответ. Вместо этого я хотел бы найти только комментарии, родительский комментарий которых не имеет родительского комментария, в этом примере это будут комментарии 3 и 5. рекурсивно получать родителей, которые я понятия не имею, как это сделать в SQL запросах.

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Я бы хотел найти только те комментарии, у которых родительский комментарий не имеет родительского комментария.

Я думаю, что вам просто нужно самосоединение и некоторая фильтрация:

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
)
0 голосов
/ 30 мая 2020

Я решил это довольно простым решением. Это может быть ужасная практика, но работает для моего варианта использования ^^

Для данного примера это будет примерно так:

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