仪表板报告 - 已接受解决方案

这是“已接受解决方案”仪表板报告的 SQL 版本。

该报告按指定日期范围内的每日统计被标记为解决方案的帖子数量。它有助于了解用户随时间推移发现答案并将其标记为解决方案的频率。

-- [参数]
-- date :start_date = 2025-03-01
-- date :end_date = 2025-04-01
-- null category_id :category_id

WITH daily_solutions AS (
  SELECT 
    DATE(ta.created_at) AS solution_date,
    COUNT(*) AS solution_count
  FROM discourse_solved_solved_topics st
  JOIN discourse_solved_topic_answers ta ON ta.solved_topic_id = st.id
  JOIN posts p ON p.id = ta.answer_post_id AND p.deleted_at IS NULL
  JOIN topics t ON t.id = st.topic_id 
                AND t.archetype <> 'private_message'
                AND t.deleted_at IS NULL
                AND (:category_id IS NULL OR t.category_id = :category_id)
  JOIN users u ON u.id = p.user_id
  WHERE 
    st.created_at BETWEEN :start_date AND :end_date
    AND u.id > 0
    AND u.active
    AND u.silenced_till IS NULL
    AND u.suspended_till IS NULL
  GROUP BY DATE(ta.created_at)
)

SELECT 
  solution_date,
  solution_count
FROM daily_solutions
ORDER BY solution_date

SQL 查询说明

此查询使用了 discourse_solved_solved_topics 表和 discourse_solved_topic_answers 表,后者是在 Discourse PR #39806 中引入的。

  • 参数:查询接受:
    • :start_date:end_date 参数,格式为 YYYY-MM-DD,并设有默认值
    • 可选的 :category_id 用于按特定类别筛选
  • 公用表表达式:使用名为 daily_solutions 的 CTE 来组织逻辑
  • 连接
    • posts - 确保解决方案帖子仍然存在且未被删除
    • topics - 确保主题存在、不是私信且未被删除
    • users - 验证解决方案发布者是否为有效用户
  • 筛选WHERE 子句:
    • 限制在指定的日期范围内
    • 确保用户处于活跃状态,未被禁言,也未被停权
    • 支持可选的类别筛选
  • 分组与排序:按日期分组并按时间顺序排列

此查询的输出将是一个日期列表,以及每个日期上被标记为解决方案的帖子数量。

示例结果

日期 已接受解决方案数
2023-11-14 16
2023-11-15 5
2023-11-16 10
2023-11-17 4
2023-11-18 2
2 个赞