Mis disculpas si esta información ya está en otro lugar, he buscado pero no he encontrado una respuesta sólida.
Estoy tratando de averiguar la forma más fácil de encontrar el correo electrónico de un usuario utilizando su nombre de usuario o ID de usuario en masa. Soy el administrador de mi sitio, por lo que tengo los permisos, y soy consciente de que puedo encontrar esta información en el perfil de un usuario. Sin embargo, necesito hacer esto para potencialmente miles de usuarios.
La situación es que, desafortunadamente, se crearon miles de cuentas de bots para votar en una encuesta que estábamos realizando, y necesito reducir con precisión los recuentos finales para determinar adecuadamente a los ganadores. He utilizado la consulta Poll results report del Data Explorer para devolver los resultados de la votación de la encuesta, pero eso no devuelve los correos electrónicos de los usuarios. Supongo que sería posible escribir otra consulta para el plugin Data Explorer que pudiera tomar una lista de IDs o nombres de usuario y devolver una lista correspondiente de correos electrónicos. Pero no tengo conocimientos de SQL, así que estoy un poco perdido al respecto.
Si alguien pudiera orientarme, o tuviera una mejor sugerencia sobre cómo obtener esta información, ¡lo agradecería!
Te recomiendo que vayas a https://ask.discourse.com/ y escribas tu consulta, diciéndole que necesitas los correos electrónicos de los usuarios (creo que necesitas unir el user_id que tienes a la tabla UserEmails para obtener las direcciones de correo electrónico).
Por alguna razón no sabía eso. Resolvió mi problema inmediatamente, ¡muchas gracias!
Por cierto, la consulta que sugirió es
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 (/* lista de IDs de usuario aquí, p. ej. 1,2,3 */)
Sí, yo también pensé en eso. La consulta inicial era todo lo que necesitaba para resolver este problema, pero que los correos electrónicos se devuelvan en la consulta de resultados de la encuesta será útil para el futuro.
Procedí y le pedí a la IA que hiciera lo que sugeriste. Con un poco de manipulación (para hacer que la encuesta específica sea seleccionable), obtuve lo siguiente:
-- [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, ¡gracias de nuevo por el consejo!
Creo que esto podría simplificarse a algo como esto (y también apoyarse en parte de la magia del explorador de datos):
-- [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
El tipo de parámetro post_id te permite pegar la URL de la publicación y obtener su post_id de esa manera (por ejemplo, https://meta.discourse.org/t/export-a-list-of-user-emails-by-user-id/373768/5). Y la mayoría de las encuestas únicas en una publicación se llaman simplemente ‘poll’ a menos que se agregue una segunda a la misma publicación (o se agregue manualmente), por lo que tener eso como valor predeterminado para :poll_name parecía útil.
Además, user_id tiene algo de magia, por lo que mostrará un avatar y un nombre de usuario como enlace a la tarjeta de usuario/perfil en lugar de simplemente el user_id en texto plano. Muy útil para ver los resultados ‘en el sitio’, aunque si planeas exportarlos, deberías agregar la tabla users nuevamente para obtener la versión en texto del nombre de usuario.