Мне кажется, я был уже близко.
Отличная работа. ![]()
Я пытаюсь понять, эффективнее ли использовать CTE, но это сводит меня с ума ![]()
WITH staff_liked AS (
SELECT COUNT(*), pa.post_id
FROM post_actions pa
JOIN group_users gu ON gu.user_id = pa.user_id
WHERE post_action_type_id = 2
AND gu.group_id = 3
AND deleted_at IS NULL
GROUP BY pa.post_id
HAVING COUNT(*) >= 5
)
SELECT p.user_id, MAX(p.created_at) AS granted_at
FROM badge_posts p
WHERE p.id IN (SELECT post_id FROM staff_liked)
AND p.user_id >= 0
GROUP BY p.user_id
HAVING COUNT(*) >= 10
Хм. Это значит, что, например, нашу закрытую категорию TL0 он не учтёт?
Да, представление badge_post предварительно фильтрует некоторые данные для упрощения запросов. Вы можете изменить его так, чтобы оно использовало таблицу posts, что позволит включить все категории, но, возможно, потребуется добавить одну-две строки для исключения удалённых постов, удалённых тем и т. д. (хотя это может быть не обязательно, если вы хотите сохранить простоту и оставить бейж у пользователей даже после удаления их постов).