Peço desculpas se esta informação já está em outro lugar, procurei mas não consegui encontrar uma resposta sólida.
Estou tentando descobrir a maneira mais fácil de encontrar o e-mail de um usuário usando o nome de usuário ou ID do usuário em massa. Eu sou o administrador do meu site, então tenho as permissões, e estou ciente de que posso encontrar essa informação no perfil de um usuário. No entanto, preciso fazer isso para potencialmente milhares de usuários.
A situação é que, infelizmente, milhares de contas de bots foram criadas para votar em uma enquete que estávamos realizando, e preciso reduzir com precisão as contagens finais para determinar adequadamente os vencedores. Usei a consulta do Explorador de Dados Relatório de resultados da enquete para retornar os resultados da votação da enquete, mas isso não retorna os e-mails dos usuários. Presumo que seria possível escrever outra consulta para o plugin do explorador de dados que pudesse pegar uma lista de IDs ou Nomes de Usuário e retornar uma lista correspondente de e-mails. Mas não tenho conhecimento em SQL, então estou um pouco perdido para descobrir isso.
Se alguém pudesse me indicar a direção certa, ou tiver uma sugestão melhor de como obter essa informação, eu agradeceria!
Recomendo que você acesse https://ask.discourse.com/ e insira a consulta que você tem e diga que precisa dos e-mails dos usuários (você precisa juntar o user_id que eu acho que você tem à tabela UserEmails para obter os endereços de e-mail)
Nem sabia disso. Resolveu meu problema imediatamente, muito obrigado!
A propósito, a consulta que sugeriu é
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 (/* list of user IDs here, e.g. 1,2,3 */)
Sim, eu também pensei nisso. A consulta inicial foi tudo o que eu precisava para resolver este problema, mas ter os e-mails retornados na consulta de resultados da enquete será útil para o futuro.
Eu fui em frente e fiz a IA fazer o que você sugeriu. Com um pouco de ajuste (para tornar a enquete específica selecionável), obtive o seguinte:
-- [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
Parece que está funcionando, obrigado novamente pelo conselho!
Acho que isso poderia ser simplificado para algo assim (e também aproveitar um pouco da mágica do explorador de dados):
-- [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
O tipo de parâmetro post_id permite que você cole a URL da postagem e obtenha seu post_id dessa forma (por exemplo, https://meta.discourse.org/t/export-a-list-of-user-emails-by-user-id/373768/5). E a maioria das enquetes únicas em uma postagem é simplesmente chamada de ‘poll’, a menos que uma segunda seja adicionada à mesma postagem (ou adicionada manualmente), então ter isso como padrão para :poll_name pareceu útil.
Além disso, user_id tem alguma mágica, então ele mostrará um avatar e nome de usuário como um link para o cartão/perfil do usuário em vez de simplesmente o user_id em texto simples. Muito útil para visualizar resultados ‘no local’, embora se você planeja exportá-los, precisará adicionar a tabela users de volta para obter a versão em texto do nome de usuário.