Это SQL-запрос Data Explorer, который извлекает список всех пользователей, подтвердивших участие в конкретном мероприятии, вместе с их основными адресами электронной почты. Он полезен для организаторов мероприятий, которым нужна контактная информация участников для последующих действий, напоминаний или внешней коммуникации.
Требуемый уровень пользователя: Администратор
Для работы этого запроса необходимо, чтобы был включен плагин Calendar (and Event).
Что делает этот запрос
Если вы проводите мероприятия на своем сайте Discourse с помощью плагина Calendar (and Event), вам может потребоваться способ получения полного списка участников с адресами электронной почты — например, для отправки предварительной информации перед мероприятием, обмена логистическими деталями или последующего взаимодействия после мероприятия.
Встроенная функция «Экспорт мероприятия» в меню мероприятия загружает список подтверждений участия, но она предоставляется в виде заархивированного файла через личное сообщение. Этот запрос 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 |
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 |
Фильтрация по статусу подтверждения участия
Приведенный выше запрос возвращает всех приглашенных независимо от их статуса подтверждения участия. Если вам нужны только пользователи, отметившие себя как «Пойду», вы можете добавить фильтр статуса в предложение WHERE. Столбец status в таблице discourse_post_event_invitees использует следующие значения:
| Код статуса | Значение |
|---|---|
0 |
Пойду |
1 |
Интересуюсь |
2 |
Не пойду |
Например, чтобы вернуть только пользователей, которые «Пойдут», добавьте 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:
CASE
WHEN invitees.status = 0 THEN 'Пойду'
WHEN invitees.status = 1 THEN 'Интересуюсь'
WHEN invitees.status = 2 THEN 'Не пойду'
END AS rsvp_status
Запуск запроса
- Перейдите в Администрирование > Плагины > Data Explorer (или перейдите по адресу
/admin/plugins/discourse-data-explorer). - Нажмите кнопку +, чтобы создать новый запрос.
- Дайте запросу имя (например, «Приглашенные на мероприятие с email»).
- Вставьте SQL-запрос в редактор запросов.
- Нажмите Запустить, а затем введите ID темы вашего мероприятия, когда будет предложено.
- Чтобы загрузить результаты, нажмите кнопку CSV или JSON после завершения выполнения запроса.
Столбец email содержит конфиденциальные личные данные. Будьте осторожны при экспорте или обмене результатами и убедитесь, что ваше использование этих данных соответствует политике конфиденциальности вашего сообщества и любым применимым правилам защиты данных.
Распространенные проблемы и решения
| Проблема | Решение |
|---|---|
| Запрос возвращает ноль результатов | Еще раз проверьте, что ID темы верен и что пользователи действительно подтвердили участие в мероприятии. Вы можете проверить это, посетив тему мероприятия и проверив список участников. |
| Ошибка «relation discourse_post_event_invitees does not exist» | Плагин Calendar (and Event) не установлен или не включен. Для работы этого запроса плагин должен быть активен. |
| В результатах появляются дублирующиеся строки | Если у пользователя несколько записей электронной почты помечены как основные (редко, но возможно), вы можете увидеть дубликаты. Добавление DISTINCT после SELECT может решить эту проблему. |