イベント招待者のメールアドレスを一覧表示する

:bookmark: これは、特定のイベントに出席を表明したすべてのユーザーのリストと、それらのユーザーのプライマリメールアドレスを取得する Data Explorer SQLクエリです。フォローアップ、リマインダー、または外部コミュニケーションのために参加者の連絡先情報を必要とするイベントコーディネーターに役立ちます。

:person_raising_hand: 必要なユーザーレベル: 管理者

:discourse2: このクエリには、カレンダー(およびイベント)プラグインが有効になっている必要があります。

このクエリの機能

Discourseサイトでカレンダー(およびイベント)プラグインを使用してイベントを実行している場合、イベント前のブリーフィングの送信、ロジスティクスの共有、またはイベント後のフォローアップのために、メールアドレスを含む完全な参加者リストを取得する必要がある場合があります。

イベントメニューの組み込みの「イベントのエクスポート」機能はRSVPのリストをダウンロードしますが、これはプライベートメッセージを介してZIPファイルとして提供されます。このData Explorerクエリは、各参加者のプライマリメールアドレスを含み、結果を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 整数 招待者を取得したいイベントのトピックID。これはイベントトピックのURLで見つけることができます。例:discourse.example.com/t/my-event-topic/23338 の場合、トピックIDは 23338 です。

クエリの仕組み

このクエリは4つのデータベーステーブルからデータを抽出し、それらを結合して単一のリストを作成します。

  1. users — ユーザー名や表示名などの基本的なユーザープロファイル情報を含みます。
  2. user_emails — 各ユーザーに関連付けられたメールアドレスを保存します。ユーザーは複数のメールアドレスを持つ可能性があるため、クエリは e.primary = true を使用してプライマリメールのみにフィルタリングします。
  3. discourse_post_event_invitees — イベントに応答した(「参加」「興味あり」「不参加」をクリックした)すべてのユーザーを記録します。各レコードは、ユーザーと、イベントを含む投稿をリンクします。
  4. posts — イベントの投稿を親トピックに接続し、内部の投稿IDを知らなくてもトピックIDで招待者を検索できるようにします。

JOIN ステートメントはこれらのテーブルをリンクし、指定されたイベントトピックの招待者リストに現れるユーザーのみが含まれるようにします。結果はユーザー名でアルファベット順に並べ替えられます。

結果の例

user_id username name email
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)

例えば、「参加」しているユーザーのみを返すには、WHERE 句に AND invitees.status = 0 を追加します。

-- [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

クエリの実行

  1. 管理者 > プラグイン > Data Explorer に移動します(または /admin/plugins/discourse-data-explorer に移動します)。
  2. + ボタンをクリックして新しいクエリを作成します。
  3. クエリに名前を付けます(例:「メール付きイベント招待者」)。
  4. SQLをクエリエディタに貼り付けます。
  5. 実行をクリックし、プロンプトが表示されたらイベントのトピックIDを入力します。
  6. 結果をダウンロードするには、クエリの実行が完了した後、CSVまたはJSONボタンをクリックします。

:information_source: メールカラムには機密性の高い個人データが含まれます。結果をエクスポートまたは共有する際は注意し、このデータの使用がコミュニティのプライバシーポリシーおよび適用されるデータ保護規制に準拠していることを確認してください。

一般的な問題と解決策

問題 解決策
クエリが結果をゼロ件返す トピックIDが正しいことを確認し、ユーザーが実際にイベントに出席を表明していることを確認します。イベントトピックにアクセスして参加者リストを確認することで検証できます。
“relation discourse_post_event_invitees does not exist” エラー カレンダー(およびイベント)プラグインがインストールされていないか、有効になっていません。このクエリはプラグインがアクティブであることを必要とします。
結果に重複行が表示される ユーザーがプライマリとしてフラグが立てられたメールレコードを複数持っている場合(稀ですが可能)、重複が表示されることがあります。SELECT の後に DISTINCT を追加することで、これを解決できます。