Исключить группы из запроса «Лучшие участники»

Привет,

Есть ли какие-либо советы по удалению определённых групп из этого запроса?

SELECT 
    sum(p.score) / count(p) as "средний балл на пост", 
    count(p.id) as post_count, 
    p.user_id
FROM posts p
JOIN users u ON u.id = p.user_id
WHERE p.created_at >= CURRENT_DATE - INTERVAL '3 month'
  AND u.active
GROUP by user_id, u.views
HAVING count(p.id) > 40
ORDER BY sum(p.score) / count(p) DESC
LIMIT 100

Заранее спасибо!

Я не тестировал это.

-- [параметры]
-- int_list :exclude_groups = 12, 2, 3

SELECT 
    sum(p.score) / count(p) as "средний балл на пост", 
    count(p.id) as количество_постов, 
    p.user_id
FROM posts p
JOIN users u ON u.id = p.user_id
LEFT JOIN group_users gu on u.id = gu.user_id
WHERE p.created_at >= CURRENT_DATE - INTERVAL '3 month'
  AND u.active
  AND (gu.group_id not IN (:exclude_groups))
GROUP by p.user_id, u.views
HAVING count(p.id) > 40
ORDER BY sum(p.score) / count(p) DESC
LIMIT 100

Спасибо, @pfaffman. Это очень мило с вашей стороны.

Я запустил скрипт и вижу, что в результатах появляются участники исключённых групп. Конечно, они состоят во многих группах. Есть ли способ, чтобы этот скрипт полностью исключил всех участников всех групп из списка :exclude_groups?

Благодарю за внимание.

А, точно. Оператор not in не сработал так, как я сначала подумал. По сути, он ничего не делает. Мне кажется, нужно сначала выполнить запрос, который находит пользователей, не состоящих ни в одной группе, а затем соединить его с остальной частью запроса.

Извините.


    -- [параметры]
    -- int_list :exclude_groups = 1,2

    SELECT 
        sum(p.score) / count(p) as "средний балл на пост", 
        count(p.id) as post_count, 
        p.user_id
    FROM posts p
    JOIN users u ON u.id = p.user_id
    WHERE p.created_at >= CURRENT_DATE - INTERVAL '3 month'
      AND u.active
      AND u.id NOT IN(
        SELECT user_id FROM group_users WHERE group_id IN (:exclude_groups)
      )
    GROUP by user_id, u.views
    HAVING count(p.id) > 40
    ORDER BY sum(p.score) / count(p) DESC
    LIMIT 100

@RGJ,

Ваш вклад в экосистему Discourse и ваша невероятная поддержка меня как клиента по-настоящему ценны. Я в восторге от того, что вы предоставляете столь замечательный хостинг-сервис!