이는 특정 이벤트에 참석을 응답(RSVP)한 모든 사용자의 목록과 그들의 기본 이메일 주소를 가져오는 Data Explorer SQL 쿼리입니다. 후속 조치, 알림 또는 외부 통신을 위해 참석자 연락처 정보가 필요한 이벤트 담당자에게 유용합니다.
필요한 사용자 권한: 관리자(Administrator)
이 쿼리를 실행하려면 Calendar (and Event) 플러그인이 활성화되어 있어야 합니다.
이 쿼리의 기능
Calendar (and Event) 플러그인을 사용하여 Discourse 사이트에서 이벤트를 진행하는 경우, 이벤트 전 브리핑 전송, 물류 정보 공유 또는 이벤트 후 후속 조치를 위해 이메일 주소가 포함된 전체 참석자 목록이 필요할 수 있습니다.
이벤트 메뉴에 내장된 “Export event” 기능은 RSVP 목록을 다운로드하지만, 이는 개인 메시지로 압축 파일 형태로 전달됩니다. 이 Data Explorer 쿼리는 각 참석자의 기본 이메일 주소를 포함하며, 결과를 화면에서 빠르게 확인하고 CSV 또는 JSON으로 직접 내보낼 수 있는 대안을 제공합니다.
이 쿼리는 주어진 이벤트에 응답한 모든 사용자를 반환합니다(“Going”, “Interested”, “Not Going” 중 어떤 선택을 했든 관계없이) 사용자를 사용자 이름(alphabetical) 순으로 정렬합니다.
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— 이벤트에 응답한 모든 사용자를 기록합니다(“Going”, “Interested”, “Not Going”을 클릭하여). 각 기록은 사용자를 이벤트가 포함된 게시물과 연결합니다.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 상태와 관계없이 모든 초대 객체를 반환합니다. “Going”으로 표시한 사용자만 원한다면 WHERE 절에 상태 필터를 추가할 수 있습니다. discourse_post_event_invitees 테이블의 status 열은 다음 값을 사용합니다:
| 상태 코드 | 의미 |
|---|---|
0 |
Going |
1 |
Interested |
2 |
Not Going |
예를 들어, “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
쿼리 실행
- Admin > Plugins > Data Explorer로 이동합니다(또는
/admin/plugins/discourse-data-explorer로 이동합니다). - + 버튼을 클릭하여 새 쿼리를 생성합니다.
- 쿼리에 이름을 부여합니다(예: “이메일이 포함된 이벤트 초대 객체”).
- SQL을 쿼리 편집기에 붙여넣습니다.
- Run을 클릭한 다음, 프롬프트가 표시되면 이벤트의 토픽 ID를 입력합니다.
- 쿼리 실행이 완료된 후 결과를 다운로드하려면 CSV 또는 JSON 버튼을 클릭합니다.
이메일 열에는 민감한 개인 데이터가 포함되어 있습니다. 결과를 내보내거나 공유할 때 주의하시고, 이 데이터의 사용이 커뮤니티의 개인정보 보호 정책 및 관련 데이터 보호 규정과 일치하는지 확인하십시오.
일반적인 문제 및 해결 방법
| 문제 | 해결 방법 |
|---|---|
| 쿼리가 0개의 결과를 반환합니다 | 토픽 ID가 정확한지, 사용자가 실제로 이벤트에 RSVP했는지 다시 확인하십시오. 이벤트 토픽을 방문하여 참석자 목록을 확인함으로써 검증할 수 있습니다. |
| “relation discourse_post_event_invitees does not exist” 오류 | Calendar (and Event) 플러그인이 설치되지 않았거나 활성화되지 않았습니다. 이 쿼리는 플러그인이 활성 상태여야 합니다. |
| 결과에 중복 행이 나타납니다 | 사용자가 기본으로 표시된 여러 이메일 기록을 가지고 있는 경우(흔하지는 않지만 가능) 중복이 발생할 수 있습니다. SELECT 뒤에 DISTINCT를 추가하면 이를 해결할 수 있습니다. |