Mi scuso se queste informazioni sono già disponibili altrove, ho cercato ma non sono riuscito a trovare una risposta definitiva.
Sto cercando di capire il modo più semplice per trovare l’email di un utente utilizzando il suo nome utente o ID utente in massa. Sono l’amministratore del mio sito, quindi ho i permessi e sono consapevole di poter trovare queste informazioni nel profilo di un utente. Tuttavia, ho bisogno di farlo per potenzialmente migliaia di utenti.
La situazione è che, sfortunatamente, sono stati creati migliaia di account bot per votare in un sondaggio che stavamo gestendo, e ho bisogno di ridurre accuratamente i conteggi finali per determinare in modo appropriato i vincitori. Ho utilizzato la query Poll results report di Data Explorer per restituire i risultati del voto per il sondaggio, ma questo non restituisce le email degli utenti. Presumo che sarebbe possibile scrivere un’altra query per il plugin Data Explorer che potrebbe prendere un elenco di ID o nomi utente e restituire un elenco corrispondente di email. Ma non sono esperto di SQL, quindi sono un po’ perso nel capirlo.
Se qualcuno potesse indicarmi la giusta direzione, o avesse un suggerimento migliore su come ottenere queste informazioni, lo apprezzerei!
Ti consiglio di andare su https://ask.discourse.com/ e inserire la query che hai, dicendogli che hai bisogno delle email degli utenti (devi unire lo user_id che penso tu abbia alla tabella UserEmails per ottenere gli indirizzi email)
Non ne ero a conoscenza. Ha risolto immediatamente il mio problema, grazie mille!
A proposito, la query che ha suggerito è
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 (/* elenco degli ID utente qui, ad es. 1,2,3 */)
Sì, ci ho pensato anch’io. La query iniziale era tutto ciò di cui avevo bisogno per risolvere questo problema, ma avere le email restituite nella query dei risultati del sondaggio sarà utile per il futuro.
Sono andato avanti e ho fatto fare all’IA come hai suggerito. Con un po’ di aggiustamenti (per rendere selezionabile il sondaggio specifico), ho ottenuto quanto segue:
-- [params]
-- int :topic_id
-- int :post_number
-- text :poll_name
SELECT polls.name AS "Nome Sondaggio",
poll_options.html AS "Risposta",
poll_votes.user_id AS "ID Utente",
users.username AS "Nome Utente",
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
Sembra che funzioni, grazie ancora per il consiglio!
Penso che questo possa essere semplificato in qualcosa di simile (e fare anche leva su un po’ della magia del data explorer):
-- [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
Il tipo di parametro post_id ti permette di incollare l’URL del post e ottenere il suo post_id in quel modo (es. https://meta.discourse.org/t/export-a-list-of-user-emails-by-user-id/373768/5). E la maggior parte dei sondaggi singoli in un post sono semplicemente chiamati ‘poll’ a meno che non se ne aggiunga un secondo allo stesso post (o se ne aggiunga uno manualmente), quindi averlo come predefinito per :poll_name è sembrato utile.
Inoltre, user_id ha una certa magia, quindi mostrerà un avatar e un nome utente come link alla scheda utente/profilo anziché semplicemente l’ID utente semplice stesso. Molto utile per visualizzare i risultati ‘sul sito’, anche se se hai intenzione di esportarli allora dovresti aggiungere nuovamente la tabella users per ottenere la versione testuale del nome utente.