获取特定类别下近期标记的数量

您好!:grinning:

我正在为我的 Discourse 实例添加一个插件,该插件可以确定某个类别中最近是否收到了特定数量的标记。它最好能返回某个时间范围内某个类别收到的标记数量(例如,类别 ID 为 X 的类别在过去 20 分钟内的标记数量)。

我正在尝试使用 Data Explorer 插件,但我对 SQL 不是很熟悉,不确定我尝试做的事情是否可行。看起来我可以使用 post_actions 表来逐个帖子完成此操作,因为 post_id 存储在帖子操作中。理想情况下,我希望通过一个查询来完成,而不是手动汇总类别中单个帖子的标记计数。

如果有人能提供帮助,我将不胜感激!

您好 @tpsReports

我没有一个非常强大的 Discourse 实例可以进行彻底的测试,但我认为这个 Data Explorer 查询可能会为您指明正确的方向。(也许其他人可以帮忙完善一下!)

SELECT count(*)
FROM post_actions AS pac
JOIN posts p on p.id = pac.post_id
JOIN topics t on t.id = p.topic_id
WHERE pac.post_action_type_id in ('3','4','7','8')
AND pac.created_at >= NOW() - INTERVAL '20 MINUTE'
AND t.category_id = '4'

在此示例中,我将标记创建以来的时间指定为 20 分钟(第 6 行),这与您在示例中给出的时间相同。
在第 7 行,我使用了类别 ID 4,但您需要使用您想要跟踪的类别的特定类别 ID。

如果您想通过名称引用类别,可以向查询添加另一个连接,如下所示:

SELECT count(*)
FROM post_actions AS pac
JOIN posts p on p.id = pac.post_id
JOIN topics t on t.id = p.topic_id
JOIN categories c on c.id = t.category_id
WHERE pac.post_action_type_id in ('3','4','7','8')
AND pac.created_at >= NOW() - INTERVAL '20 MINUTE'
AND c.name = 'General'

然后,将第 8 行中我使用的 General 替换为您类别的名称。请记住,类别名称区分大小写。

如果这对您有帮助,请告诉我!

4 个赞

@southpaw 抓到你了;我正要发 :smile:

如果你有兴趣,我添加了可以填写的自定义字段:

--[params]
-- int_list :category_ids
-- text :interval = 20min

SELECT t.category_id, count(pa.id) count
from post_actions pa
INNER JOIN posts p on p.id = pa.post_id
INNER JOIN topics t on t.id = p.topic_id
WHERE post_action_type_id in (3, 4, 6, 7, 8)
    AND t.category_id in (:category_ids)
    AND pa.created_at >= now() - interval :interval
GROUP BY t.category_id

你可以输入多个分类 ID 和自定义间隔(例如 1h、30 min、3 months 等)

注意:我保留了 the post_action_type_id 6,我认为这与用户收到警告有关;我不确定你是否也想计数;如果不想,请随时删除它。

3 个赞

只是告知您一下,6 是“通知用户”,这是从标记菜单发起的用于用户之间私人消息的选项::+1:

尽管版主有可能将其标记为官方警告。

3 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.