Приношу извинения, если эта информация уже где-то есть; я искал, но не смог найти чёткого ответа.
Я пытаюсь понять, как проще всего найти email пользователя по его имени пользователя или ID массово. Я администратор своего сайта, поэтому у меня есть соответствующие права, и я знаю, что эту информацию можно найти на странице профиля пользователя. Однако мне нужно сделать это для потенциально тысяч пользователей.
Ситуация следующая: к сожалению, были созданы тысячи бот-аккаунтов для голосования в нашем опросе, и мне нужно точно скорректировать итоговые подсчёты, чтобы правильно определить победителей. Я использовал запрос в Data Explorer «Отчёт о результатах опроса» для получения результатов голосования, но он не возвращает email-адреса пользователей. Я предполагаю, что можно написать другой запрос для плагина Data Explorer, который будет принимать список ID или имён пользователей и возвращать соответствующий список email-адресов. Но я не разбираюсь в SQL, поэтому немного растерян в этом вопросе.
Если кто-то сможет подсказать правильное направление или предложить лучший способ получения этой информации, буду очень признателен!
Я рекомендую вам перейти на https://ask.discourse.com/, ввести свой запрос и указать, что вам нужны адреса электронной почты пользователей (вам нужно соединить user_id, который, как я полагаю, у вас есть, с таблицей UserEmails, чтобы получить адреса электронной почты).
Как-то не знал об этом. Сразу решил мою проблему, большое спасибо!
Кстати, рабочий запрос:
SELECT users.id AS user_id, user_emails.email
FROM users
LEFT JOIN user_emails ON users.id = user_emails.user_id AND user_emails.primary
WHERE users.id IN (/* список ID пользователей здесь, например 1,2,3 */)
Да, я тоже так подумал. Исходного запроса было достаточно, чтобы решить эту проблему, но наличие адресов электронной почты в результатах опроса будет полезно в будущем.
Я последовал твоему совету и попросил ИИ выполнить это. После небольшой доработки (чтобы можно было выбрать конкретный опрос) у меня получилось следующее:
-- [params]
-- int :topic_id
-- int :post_number
-- text :poll_name
SELECT polls.name AS "Poll Name",
poll_options.html AS "Answer",
poll_votes.user_id AS "User ID",
users.username AS "Username",
user_emails.email AS "Email"
FROM poll_options
INNER JOIN poll_votes ON poll_options.id = poll_votes.poll_option_id
INNER JOIN polls ON polls.id = poll_votes.poll_id
INNER JOIN users ON users.id = poll_votes.user_id
LEFT JOIN user_emails ON users.id = user_emails.user_id AND user_emails.primary
WHERE poll_options.poll_id IN (
SELECT polls.id FROM polls
WHERE polls.post_id = (
SELECT posts.id FROM posts WHERE topic_id = :topic_id AND post_number = :post_number
) AND polls.name = :poll_name
)
ORDER BY polls.name, poll_options.html
Я думаю, это можно упростить до чего-то вроде этого (а также задействовать некоторые возможности «магии» проводника данных):
-- [params]
-- post_id :post_url
-- text :poll_name = poll
SELECT
pv.user_id,
po.html AS answer,
ue.email
FROM poll_options po
JOIN poll_votes pv ON po.id = pv.poll_option_id
JOIN polls p ON p.id = pv.poll_id
JOIN user_emails ue ON pv.user_id = ue.user_id AND ue.primary
WHERE p.post_id = :post_url
AND p.name = :poll_name
ORDER BY po.html
Тип параметра post_id позволяет вставить URL поста и автоматически получить его идентификатор (например, https://meta.discourse.org/t/export-a-list-of-user-emails-by-user-id/373768/5). Кроме того, большинство одиночных опросов в посте по умолчанию называются «poll», если только к тому же посту не добавлен второй опрос (или он не добавлен вручную), поэтому использование этого значения по умолчанию для :poll_name кажется удобным.
Также параметр user_id обладает некоторыми «магическими» свойствами: он отображает аватар и имя пользователя в виде ссылки на карточку профиля пользователя, а не просто обычный идентификатор. Это очень удобно для просмотра результатов «на сайте», хотя если вы планируете их экспортировать, вам нужно будет добавить таблицу users обратно, чтобы получить текстовую версию имени пользователя.