Exclure les groupes de la requête des membres de haute qualité

Bonjour,

Avez-vous des conseils sur la façon de supprimer certains groupes de cette requête ?

SELECT 
    sum(p.score) / count(p) as "moyenne des scores par publication", 
    count(p.id) as nombre_de_publications, 
    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

D’avance, merci !

Je n’ai pas vraiment testé cela.

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

SELECT 
    sum(p.score) / count(p) as "moyenne des scores par publication", 
    count(p.id) as nombre_de_publications, 
    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

Merci @pfaffman. C’est très aimable à vous.

J’ai exécuté le script et je vois des membres des groupes exclus apparaître dans les résultats. Bien sûr, ils sont membres de nombreux groupes. Existe-t-il un moyen pour ce script d’exclure absolument tous les membres de tous les groupes figurant dans la liste :exclude_groups ?

Merci de votre attention.

Oh. D’accord. L’opérateur not in n’a pas fonctionné comme je l’avais d’abord pensé. Il ne fait presque rien. Je pense qu’il faut d’abord effectuer une requête qui récupère les utilisateurs n’appartenant à aucun groupe, puis la joindre à l’autre partie de la requête.

Désolé.


    -- [params]
    -- int_list :exclude_groups = 1,2

    SELECT 
        sum(p.score) / count(p) as "moyenne des scores par publication", 
        count(p.id) as nombre_publications, 
        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,

Vos contributions à l’écosystème Discourse et votre soutien incroyable en tant que client sont vraiment appréciés. Je suis ravi que vous offriez un service d’hébergement aussi exceptionnel !