这是一个 数据资源管理器 SQL 查询,用于检索已回复特定事件的所有用户列表及其主要电子邮件地址。这对于需要与会者联系信息以进行跟进、提醒或外部通信的活动协调员非常有用。
所需用户级别:管理员
此查询需要启用 日历(和事件)插件。
此查询的作用
如果您使用 日历(和事件)插件 在您的 Discourse 网站上举办活动,您可能需要一种方法来获取包含电子邮件地址的完整与会者列表——例如,用于发送活动前简报、共享后勤信息或在活动后进行跟进。
事件菜单中内置的“导出事件”功能会下载一份 RSVP 列表,但它会通过私信以压缩文件的形式提供。此数据资源管理器查询为您提供了一个更快速的、在屏幕上显示的替代方案,该方案包含每位与会者的主要电子邮件地址,并允许您直接将结果导出为 CSV 或 JSON。
该查询会返回已回复给定事件的所有用户(无论他们选择“参加”、“感兴趣”还是“不参加”),并按用户名字母顺序排序。
SQL 查询
-- [params]
-- integer :event_topic_id = 23338
SELECT
u.id AS user_id,
u.username,
u.name,
e.email
FROM users u
JOIN user_emails e ON u.id = e.user_id
JOIN discourse_post_event_invitees invitees ON u.id = invitees.user_id
JOIN posts p ON p.id = invitees.post_id
WHERE e.primary = true
AND p.topic_id = :event_topic_id
ORDER BY u.username
参数
| 参数 | 类型 | 描述 |
|---|---|---|
:event_topic_id |
Integer | 要从中提取受邀者的事件的主题 ID。您可以在事件主题的 URL 中找到它——例如,在 discourse.example.com/t/my-event-topic/23338 中,主题 ID 是 23338。 |
查询工作原理
此查询从四个数据库表中提取数据并将它们组合起来以生成单个列表:
users— 包含基本的用户名和显示名称等用户信息。user_emails— 存储与每个用户关联的电子邮件地址。一个用户可以有多个电子邮件地址,因此查询会过滤以仅包含主要电子邮件,使用e.primary = true。discourse_post_event_invitees— 记录对事件做出响应的每个用户(通过点击“参加”、“感兴趣”或“不参加”)。每条记录都将一个用户链接到包含事件的帖子。posts— 将事件的帖子与其父主题关联起来,允许您按主题 ID 查找受邀者,而无需知道内部帖子 ID。
JOIN 语句将这些表链接在一起,因此只包含在指定事件主题的受邀者列表中的用户。结果按用户名按字母顺序排序。
示例结果
| user_id | username | name | |
|---|---|---|---|
| 42 | alice_m | Alice Martinez | alice@example.com |
| 87 | bob_jones | Bob Jones | bob@example.com |
| 15 | carol_w | Carol Wu | carol@example.com |
| 63 | david_k | David Kim | david@example.com |
按 RSVP 状态筛选
上述查询会返回所有受邀者,无论其 RSVP 状态如何。如果您只想要标记自己为“参加”的用户,可以在 WHERE 子句中添加状态过滤器。discourse_post_event_invitees 表中的 status 列使用以下值:
| 状态代码 | 含义 |
|---|---|
0 |
参加 (Going) |
1 |
感兴趣 (Interested) |
2 |
不参加 (Not Going) |
例如,要仅返回“参加”的用户,请将 AND invitees.status = 0 添加到 WHERE 子句中:
-- [params]
-- integer :event_topic_id = 23338
SELECT
u.id AS user_id,
u.username,
u.name,
e.email
FROM users u
JOIN user_emails e ON u.id = e.user_id
JOIN discourse_post_event_invitees invitees ON u.id = invitees.user_id
JOIN posts p ON p.id = invitees.post_id
WHERE e.primary = true
AND p.topic_id = :event_topic_id
AND invitees.status = 0
ORDER BY u.username
您还可以通过添加 CASE 表达式,将 RSVP 状态显示为可读标签而不是数字:
CASE
WHEN invitees.status = 0 THEN 'Going'
WHEN invitees.status = 1 THEN 'Interested'
WHEN invitees.status = 2 THEN 'Not Going'
END AS rsvp_status
运行查询
- 转到 管理 > 插件 > 数据资源管理器(或导航到
/admin/plugins/discourse-data-explorer)。 - 单击 + 按钮创建一个新查询。
- 为查询命名(例如,“带有电子邮件的事件受邀者”)。
- 将 SQL 粘贴到查询编辑器中。
- 单击 运行,然后在出现提示时输入您事件的主题 ID。
- 要下载结果,请在查询运行完成后单击 CSV 或 JSON 按钮。
电子邮件列包含敏感的个人数据。在导出或共享结果时要小心,并确保您对该数据的使用符合您社区的隐私政策和任何适用的数据保护法规。
常见问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 查询返回零结果 | 仔细检查主题 ID 是否正确,以及用户是否确实已回复该事件。您可以通过访问事件主题并查看与会者列表来验证。 |
| “relation discourse_post_event_invitees does not exist” 错误 | 日历(和事件)插件 未安装或未启用。此查询要求插件处于活动状态。 |
| 结果中出现重复行 | 如果一个用户的多个电子邮件记录被标记为主要(这种情况很少见,但有可能),您可能会看到重复项。在 SELECT 后面添加 DISTINCT 可以解决此问题。 |