常见 Discourse 数据技巧

这展示了几个 Discourse 数据怪癖的良好示例,它们可以帮助您在构建查询时获得更准确的结果。

由于大多数帖子和主题在删除时会被“软删除”,这意味着它们仍会出现在数据库中,并可包含在自定义报告统计信息中,因此,例如,在您可能要为用户或类别统计信息提取的任何结果中过滤掉它们会很有帮助。同样,您可能还希望从统计信息中排除个人消息以及系统用户。

以下是一些过滤掉这些信息的技巧:

此 SQL 查询用于获取(排除系统用户)发布公共帖子最多的前 10 名用户,并排除已删除的任何帖子或来自已删除主题的帖子。

-- 从 posts 表中选择 user_id 并计算每个用户发布的帖子数量
SELECT 
    p.user_id,
    COUNT(p.id) AS "Post Count"
FROM posts p
  -- 在 topic_id 上与 topics 表进行左连接
  LEFT JOIN topics t ON t.id = p.topic_id
WHERE 
  -- 排除私人消息主题
  t.archetype <> 'private_message'
  -- 排除已删除的主题
  AND t.deleted_at ISNULL
  -- 排除已删除的帖子
  AND p.deleted_at ISNULL
  -- 排除低语、小型操作帖子和版主帖子
  AND p.post_type = 1
  -- 排除系统用户和 discobot(user_id 0 和 -1)发布的帖子
  AND p.user_id > 0
-- 按 user_id 对结果进行分组 
GROUP BY 1
-- 按帖子数量降序对结果进行排序 
ORDER BY 2 DESC
-- 将结果限制为帖子最多的前 10 名用户
LIMIT 10

这是没有内联注释的版本:

SELECT 
    p.user_id,
    COUNT(p.id) AS "Post Count"
FROM posts p
  LEFT JOIN topics t ON t.id = p.topic_id
WHERE t.archetype <> 'private_message'
  AND t.deleted_at ISNULL
  AND p.deleted_at ISNULL
  AND p.post_type = 1
  AND p.user_id > 0
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10

这只是一个简单的查询,用于演示示例,但希望这能帮助您开始使用数据浏览器。:+1: 如果您有任何问题,请在下方提问。:slight_smile:

10 个赞

你的意思是这里的消息吗?

任何帖子,或来自[…]的帖子

对我来说听起来很奇怪。

不这么认为?它的意思是已删除主题中的帖子不包含在内。使用“messages”听起来像是指私信。但我会再看看如何更清楚地描述它。:+1:


另一个想法 -

包含 AND p.post_type = 1 可能也适合这个。:thinking:

1 个赞

我想这可能是因为它也过滤掉了私信,并且

排除任何消息、已删除的帖子以及来自已删除主题的帖子。

这比

排除任何已删除的帖子或来自已删除主题的帖子。

对我来说更有意义。

现在重读一遍,我确实明白了最初的意图,所以它就在那里,只是不像我预期的那样清晰。 :person_shrugging:

1 个赞