Gruppen von der Top Quality Members-Abfrage ausschließen

Hallo,

Hast du einen Rat, wie ich bestimmte Gruppen aus dieser Abfrage entfernen kann?

SELECT 
    sum(p.score) / count(p) as "durchschnittliche Punktzahl pro Beitrag", 
    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

Vielen Dank im Voraus!

Ich habe das nicht wirklich getestet.

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

SELECT 
    sum(p.score) / count(p) as "durchschnittliche Punktzahl pro Beitrag", 
    count(p.id) as anzahl_beitraege, 
    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

Vielen Dank, @pfaffman. Das ist sehr nett von Ihnen.

Ich habe das Skript ausgeführt und stelle fest, dass Mitglieder der ausgeschlossenen Gruppen in den Ergebnissen erscheinen. Natürlich sind sie Mitglieder vieler Gruppen. Gibt es eine Möglichkeit, dass dieses Skript alle Mitglieder aller Gruppen in der :exclude_groups-Liste absolut ausschließt?

Vielen Dank für Ihre Mühe.

Ah, richtig. not in hat nicht so funktioniert, wie ich zuerst dachte. Es bewirkt meistens nichts. Ich denke, was passieren muss, ist zuerst eine Abfrage, die Benutzer ohne Gruppen ermittelt, und dann eine Verknüpfung davon mit dem anderen Teil der Abfrage.

Entschuldigung.


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

    SELECT 
        sum(p.score) / count(p) as "durchschnittliche Punktzahl pro Beitrag", 
        count(p.id) as anzahl_beitraege, 
        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,

Dein Beitrag zum Discourse-Ökosystem und deine großartige Unterstützung als Kunde werden sehr geschätzt. Ich freue mich riesig, dass du einen so unglaublichen Hosting-Service anbietest!