هل لديك أي نصائح حول كيفية إزالة مجموعات معينة من هذا الاستعلام؟
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
شغّلت السكربت وأرى أعضاء المجموعات المستبعدة يظهرون في النتائج. بالطبع، هم أعضاء في العديد من المجموعات. هل هناك طريقة لكي يستبعد هذا السكربت تمامًا جميع أعضاء جميع المجموعات المدرجة في قائمة :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