这是帖子编辑仪表板报告的 SQL 版本。
此仪表板报告显示在特定日期范围内被编辑的帖子,并包含有关编辑者、帖子作者以及帖子被编辑原因的信息。此报告旨在帮助管理员监控和了解其论坛内发生的编辑活动,特别关注非原始作者的用户编辑帖子的案例。
-- [params]
-- date :start_date = 2023-12-16
-- date :end_date = 2024-01-16
SELECT
pr.created_at::date as day,
pr.post_id as post_id,
pr.user_id AS editor_user_id,
p.user_id AS author_user_id,
p.edit_reason
FROM post_revisions pr
JOIN posts p ON p.id = pr.post_id
WHERE pr.created_at BETWEEN :start_date AND :end_date
AND pr.user_id > 0
AND pr.user_id <> p.user_id
ORDER BY pr.created_at ASC
SQL 查询说明
- 参数声明:
- 查询接受两个参数
:start_date和:end_date,它们定义了报告的日期范围。两个日期参数都接受YYYY-MM-DD格式的日期。
- 查询接受两个参数
- 数据选择:
SELECT语句指定了最终报告中将显示的列。这些列包括:pr.created_at::date as day: 帖子修订创建的日期,并将其转换为date类型以移除时间部分。pr.post_id: 被编辑帖子的 ID。pr.user_id AS editor_user_id: 进行编辑的用户的 ID。此列别名为editor_user_id,以区别于原始帖子的作者。p.user_id AS author_user_id: 原始帖子作者的用户的 ID,别名为author_user_id。p.edit_reason: 提供编辑原因(如果有)。
- 连接表:
FROM子句包含一个JOIN语句,该语句将post_revisions表 (pr) 与posts表 (p) 合并。连接基于post_revisions.post_id匹配posts.id的条件,从而将修订与原始帖子详细信息关联起来。 - 筛选器:
WHERE子句对数据应用了几个筛选器:pr.created_at BETWEEN :start_date AND :end_date: 仅包括在参数指定的日期范围内的帖子修订。pr.user_id > 0: 确保编辑者是实际用户而不是系统操作(用户 ID 为 0 通常表示系统操作)。pr.user_id <> p.user_id: 过滤掉由帖子原始作者进行的修订,仅关注由不同用户进行的编辑。
- 排序结果:
ORDER BY pr.created_at ASC子句根据每个帖子修订创建的时间戳,按从旧到新的顺序对结果进行排序。
示例结果
| day | post | editor_user | author_user | edit_reason |
|---|---|---|---|---|
| 2023-12-20 | post_abc | user1 | user2 | Example Edit Reason |
| 2023-12-21 | post_dfg | user3 | user4 | Example Edit Reason |
| 2023-12-24 | post_xyz | user5 | user6 | NULL |