トップクオリティメンバークエリからグループを除外

こんにちは

このクエリから特定のグループを除外する方法について、ご助言いただけますでしょうか?

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

ご回答を心よりお待ちしております。

あまりテストしていません。

-- [params]
-- 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 投稿数, 
        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 エコシステムへの貢献と、カスタマーとして私に対する素晴らしいサポートに心から感謝申し上げます。このような素晴らしいホスティングサービスを提供してくださっていることに、大変嬉しく思います!