كيفية تصفية المواضيع حسب مجموعة المستخدمين

هل هناك أي طريقة يمكنني من خلالها تصفية المواضيع الموجودة في المنتدى بناءً على مجموعة المستخدمين التي ينتمي إليها مؤلف آخر رد؟

على سبيل المثال، بعد أن أحدد مجموعة من المستخدمين باسم “العملاء”، أريد تصفية جميع المواضيع التي لم يرد فيها مستخدمو العملاء.

شكراً لأي مساعدة.

إذا كان لدى منتداك المكون الإضافي Data Explorer Plugin مثبتًا، فيمكنك كتابة استعلامات SQL لجلب هذه المعلومات من قاعدة بيانات Discourse. يحاول هذا الاستعلام جلب المعرف والعنوان للمواضيع، ومعرف المستخدم لآخر مشاركة في الموضوع. يقوم فقط بتحديد المواضيع حيث تم إجراء آخر مشاركة بواسطة مستخدم في مجموعة “clients”.

هذا مجرد مثال.

SELECT 
    t.id AS topic_id, 
    t.title AS topic_title, 
    (SELECT user_id FROM posts WHERE topic_id = t.id ORDER BY created_at DESC LIMIT 1) AS last_post_user_id
FROM 
    topics t
JOIN
    posts p ON p.topic_id = t.id
JOIN 
    group_users gu ON gu.user_id = p.user_id
JOIN 
    groups g ON g.id = gu.group_id
WHERE 
    g.name = 'clients'
GROUP BY 
    t.id
HAVING 
    MAX(p.user_id) = last_post_user_id
ORDER BY 
    MAX(p.created_at) DESC
إعجاب واحد (1)

لست متأكدًا مما إذا كان لدينا t.last_post_id؟

إعجاب واحد (1)

شكرًا لك على اكتشاف ذلك، لا يوجد حقل last_post_id في جدول topics. :face_with_spiral_eyes:

إعجابَين (2)

لا تقلق. أعتقد أن النسخة المعدلة تعمل. :+1: :slight_smile: للملاحظة فقط، قد يكون من المفيد أيضًا إضافة بعض الأشياء الإضافية لتصفية المواضيع/المشاركات المحذوفة، والرسائل الخاصة، والمناقشات/منشورات الإجراءات الصغيرة أيضًا. شيء مثل:

SELECT 
    t.id AS topic_id, 
    t.title AS topic_title, 
    (SELECT user_id FROM posts WHERE topic_id = t.id ORDER BY created_at DESC LIMIT 1) AS last_post_user_id
FROM topics t
JOIN posts p ON p.topic_id = t.id
JOIN group_users gu ON gu.user_id = p.user_id
JOIN groups g ON g.id = gu.group_id
WHERE g.name = 'clients'
AND t.deleted_at ISNULL
AND p.deleted_at ISNULL
AND p.post_type = 1
AND t.archetype = 'regular'
GROUP BY t.id
HAVING MAX(p.user_id) = last_post_user_id
ORDER BY MAX(p.created_at) DESC

على الرغم من أنني لا أعتقد أن هذا سيلتقط أي موضوع قام فيه منشئ الموضوع بالرد مرة أخرى (على سبيل المثال، ليقول ‘شكرًا’ وما إلى ذلك)، لذلك قد يحتاج إلى طريقة مختلفة اعتمادًا على ما تبحث عنه @kenjdarhan. هل ستكون مواضيع تم إنشاؤها بواسطة العملاء تحديدًا والتي تلقت ردًا من عضو في الفريق ولم يتم حلها؟ شيء من هذا القبيل؟

4 إعجابات

مرحباً يا جيمي،

إنها ببساطة الموضوعات التي تم فيها إنشاء أحدث رد بواسطة مستخدم من مجموعة المستخدمين “العميل”.

إذا تم الرد على موضوع بواسطة مستخدم غير عميل (أي أحد زملائي)، فلن أحتاج إلى التركيز على هذا الموضوع لأن الزميل الذي رد سيواصل حل المشكلة في الموضوع إذا لم يتم حل المشكلة.

إعجاب واحد (1)

يبدو أنك بحاجة إلى شيء مختلف قليلاً. :slight_smile: كل منتدى مختلف قليلاً، لذا قد تحتاج الحلول إلى التكيف، ولكنني سأصف هذه الموجز بـ “المواضيع التي أنشأها المستخدمون في مجموعة ‘العميل’، دون رد من مستخدم في مجموعة ‘الفريق’”. إذا كان هذا هو الحال، فيمكنك تكييف هذا الاستعلام باستخدام group_ids الصحيحة ويجب أن يفعل ما تريده:

-- [params]
-- date :start_date = 01/01/2023
-- date :end_date = 01/06/2023

WITH team_replies AS (

SELECT topic_id
FROM posts
WHERE user_id IN (SELECT user_id FROM group_users WHERE group_id = 3) --group_id of your 'team' group
  AND post_number <> 1
  AND deleted_at ISNULL
  AND post_type = 1
GROUP BY topic_id
)


SELECT t.created_at::date,
       t.id AS topic_id,
       MIN(p.id) AS first_post_id
FROM topics t
JOIN posts p ON p.topic_id = t.id
WHERE t.user_id IN (SELECT user_id FROM group_users WHERE group_id = 45) -- group_id of your 'client' group
  AND t.id NOT IN (SELECT topic_id FROM team_replies)
  AND t.created_at BETWEEN :start_date AND :end_date
  AND t.deleted_at ISNULL
  AND t.archetype = 'regular'
GROUP BY t.id
ORDER BY 1 ASC

هذا يعمل بسلاسة أكبر إذا كنت تعرف group_ids بدلاً من استخدام أسماء المجموعات. يمكنك العثور عليها في JSON الخاص بالمجموعة (على سبيل المثال، /g/admins.json)، على الرغم من أنه يمكنك أيضًا استخدام شيء مثل هذا كبحث سريع:


-- [params]
-- string :group_name

SELECT name,
       id
FROM groups
WHERE name LIKE LOWER (:group_name)

وستحتاج أيضًا إلى تحديث الصفحة في المرة الأولى التي تنسخ فيها الاستعلامات إلى مستكشف البيانات الخاص بك لالتقاط مربعات إدخال المعلمات. :+1:

شكراً يا جامي. سأجرب ذلك.