Группировать при объединении и вычислять максимальное количество групп

#sql #postgresql

#sql #postgresql

Вопрос:

У меня есть 3 таблицы, как описано ниже:

Все три таблицы и выводимое изображение

таблица записей

post_comments публикует комментарии

комментарии comments

Теперь я хочу получить сообщения с наибольшим количеством понравившихся комментариев, и статус этого комментария должен быть активным в Postgres.

ВЫВОД:

публикует результирующие записи

ПРИМЕЧАНИЕ: Поскольку для сообщения 1 комментарий с наибольшим лайком неактивен.

Я пробовал что-то вроде этого:

 select "posts".*
from "posts" 
inner join (select id, max(likes) l from comments innner join post_comments on comments.id = post_comments.alert_id and post_comments.post_id = posts.id) a on posts.id = a.cid ... 
  

Это не завершено, но я не могу этого сделать.

Комментарии:

1. Примеры данных и желаемые результаты помогли бы.

Ответ №1:

В Postgres вы можете получить активный комментарий с наибольшим количеством лайков для каждого поста, используя distinct on :

 select distinct on (pc.post_id) pc.*
from post_comments pc join
     comments c
     on pc.comment_id = c.id
where c.status = 'active'
order by pc.post_id, c.likes desc;
  

Я думаю, что это вполне связано с тем, что вы хотите.

Ответ №2:

Попробуйте что-то вроде этого:

 SELECT posts.*, MAX(likes) l
FROM posts
  JOIN post_comments ON post_id = posts.id
  LEFT JOIN comments ON comment_id = comments.id
GROUP BY posts.id