Этот запрос возвращает всех пользователей (включая их электронные адреса), которые отправили личные сообщения или письма в групповой ящик, исключая участников этой группы.
Сценарий использования: создание упрощённого способа регистрации пользователей на физическом мероприятии для моего сайта.
Я обнаружил, что на очных мероприятиях многие потенциальные пользователи испытывают трудности с завершением процесса регистрации (который включает ввод правильного адреса электронной почты, выбор имени пользователя и создание пароля как минимум). Кроме того, требуется подтверждение адреса электронной почты и последующий вход в систему. Это серьёзное требование, когда люди стоят, общаются, слушают докладчика, едят и так далее!
Частично это можно смягчить с помощью OAuth2, но всё равно остаётся ряд действий, и менее технически подкованные пользователи всё равно с трудом справляются.
Моё решение
-
Создать полуприватную группу с запоминающимся адресом для входящей почты (например, join@mycommunity.url).
-
Предоставить QR-код, содержащий ссылку mailto: на этот адрес.
-
Включить в группу людей, которые будут заниматься последующей регистрацией этих пользователей.
-
Добавить следующий запрос в Data Explorer и предоставить доступ к нему группе:
-- [params]
-- string :group_name
WITH group_members AS (
SELECT gu.user_id
FROM group_users gu
JOIN groups g ON g.id = gu.group_id
WHERE g.name = :group_name
),
non_group_users AS (
SELECT u.id, u.username, ue.email, u.created_at
FROM users u
JOIN user_emails ue ON ue.user_id = u.id
WHERE NOT EXISTS (
SELECT 1
FROM group_members gm
WHERE u.id = gm.user_id
) AND ue.primary = TRUE
),
group_messages AS (
SELECT tg.topic_id
FROM topic_allowed_groups tg
JOIN groups g ON g.id = tg.group_id
WHERE g.name = :group_name
),
group_message_participants AS (
SELECT gm.topic_id, tau.user_id AS tau_user_id FROM group_messages gm
JOIN topic_allowed_users tau ON tau.topic_id = gm.topic_id
JOIN non_group_users ngu ON ngu.id = tau.user_id
)
SELECT ngu.username, ngu.email, ngu.created_at FROM group_message_participants gmp
JOIN non_group_users ngu ON ngu.id = gmp.tau_user_id
GROUP BY ngu.username, ngu.email, ngu.created_at
ORDER BY ngu.username
После этого потребуется немного дообработки, но как минимум вы надёжно получаете адреса электронной почты пользователей, для чего им достаточно сделать всего два-три клика или касания!