如何按用户组筛选主题

有没有办法根据最新回复的作者所属的用户组来过滤论坛上的现有主题?

例如,在我将一组用户定义为“客户”之后,我想过滤掉所有客户用户尚未回复的主题。

感谢任何帮助。

如果您的论坛安装了数据探索器插件(Data Explorer Plugin),您就可以编写 SQL 查询语句从 Discourse 数据库中获取这些信息。此查询尝试获取主题的 ID 和标题,以及主题中最后一篇帖子的用户 ID。它只选择最后一篇帖子是由“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 个赞

谢谢你找到这个,topics 表中没有 last_post_id 字段。: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 个赞

你好 Jammy,

这仅仅是最新回复是由“client”用户组中的用户创建的主题。

如果某个主题有非客户用户(即我的同事)回复过,我就不需要关注该主题,因为如果问题尚未解决,回复的同事将继续在主题中解决问题。

1 个赞

这听起来你需要一些不同的东西。 :slight_smile: 每个论坛都略有不同,因此解决方案可能需要调整,但我会将此简报描述为“由“client”组中的用户创建的主题,而“team”组中的用户没有回复”。如果确实如此,那么你可以使用正确的 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) -- 你“team”组的 group_id
  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) -- 你“client”组的 group_id
  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:

谢谢 Jammy。我会试试的。