Excluir grupos da Consulta de Membros de Alta Qualidade

Olá,

Alguma sugestão sobre como remover certos grupos desta consulta?

SELECT 
    sum(p.score) / count(p) as "média de pontuação por post", 
    count(p.id) as contagem_de_posts, 
    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

Agradeço antecipadamente!

Eu não testei isso realmente.

-- [params]
-- int_list :exclude_groups = 12, 2, 3

SELECT 
    sum(p.score) / count(p) as "média de pontuação por post", 
    count(p.id) as contagem_de_posts, 
    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

Obrigado, @pfaffman. Isso é muito gentil da sua parte.

Executei o script e vejo membros dos grupos excluídos aparecendo nos resultados. É claro, eles são membros de muitos grupos. Existe alguma maneira de este script excluir absolutamente todos os membros de todos os grupos na lista :exclude_groups?

Obrigado pela sua consideração.

Ah, certo. O not in não funcionou como eu imaginei inicialmente. Ele basicamente não faz nada. Acredito que o que precisa ser feito é primeiro uma consulta que obtenha usuários que não estão em nenhum grupo e, em seguida, fazer um join com a outra parte da consulta.

Desculpe.


    -- [parâmetros]
    -- int_list :exclude_groups = 1,2

    SELECT 
        sum(p.score) / count(p) as "média de pontuação por postagem", 
        count(p.id) as contagem_de_postagens, 
        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,

Suas contribuições para o ecossistema Discourse e seu incrível suporte a mim como cliente são verdadeiramente apreciados. Estou entusiasmado por você oferecer um serviço de hospedagem tão incrível!