I just tested out polls for the first time in a while, and it works quite well and I like it.
But I would like to have an open poll so we can see who voted for which option. Is this possible? Is there any way to see who voted for what?
I just tested out polls for the first time in a while, and it works quite well and I like it.
But I would like to have an open poll so we can see who voted for which option. Is this possible? Is there any way to see who voted for what?
You can run the following query to get a list of users who voted and their selected poll options.
Please choose the appropriate query for your Discourse version.
-- [params]
-- post_id :post_id
-- text :poll_name = poll
SELECT u.id AS user_id, u.username, v.poll_option_id AS option_id, o.html AS option_html
FROM polls p
JOIN poll_votes v ON (p.id = v.poll_id)
JOIN poll_options o ON (o.id = v.poll_option_id)
JOIN users u ON (v.user_id = u.id)
WHERE p.post_id = :post_id AND p.name = :poll_name
ORDER BY u.username, v.poll_option_id
-- [params]
-- post_id :post_id
-- text :poll_name = poll
SELECT votes.user_id, users.username, votes.option_id, options.html AS option_html
FROM (
SELECT value1 ->> 'id' AS id,
value1 ->> 'html' AS html
FROM (
SELECT json_array_elements(value :: JSON -> :poll_name -> 'options') AS value1
FROM post_custom_fields
WHERE post_id = :post_id AND name = 'polls' AND value :: JSON -> :poll_name ->> 'name' = :poll_name
) option_values
) options
JOIN (
SELECT key :: INTEGER AS user_id,
trim(json_array_elements(value :: JSON -> :poll_name) :: TEXT, '"') AS option_id
FROM json_each((
SELECT value :: JSON
FROM post_custom_fields
WHERE post_id = :post_id AND name LIKE 'polls-votes'
))
) votes ON (options.id = votes.option_id)
JOIN users ON (votes.user_id = users.id)
ORDER BY users.username, votes.option_id
You can use the following query if you need to find the right post_id.
-- [params]
-- topic_id :topic_id
-- int :post_number = 1
SELECT id
FROM posts
WHERE topic_id = :topic_id AND post_number = :post_number
it works! thanks so much. ![]()
is there a query for quickly identifying the post ID containing polls? I used the .json URL method but it was surprisingly cumbersome to find the right post within it.
Default values are specified like this:
I updated the query. It’s now a lot simpler. ![]()
Existe alguma maneira de filtrar os resultados com base na idade da conta?
Por exemplo, se uma conta tiver menos de 60 dias de idade, ela nĂŁo apareceria nos resultados? Ou talvez haja uma maneira de criar uma enquete que limite quem pode votar com base na idade da conta?
Estamos tentando prevenir possĂveis fraudes em votações por contas recĂ©m-criadas para uma votação importante que se aproxima.
Esse Ă© um caso de uso muito interessante. Acredito que deverĂamos ter uma opção para impedir que usuários TL0 votem em uma enquete, @zogstrip!
Existe algum parâmetro que eu possa adicionar Ă string de busca feita por @gerhard que nĂŁo mostre usuários abaixo de um determinado nĂvel de confiança ou idade da conta na consulta?
Mesmo que eu tivesse que contar manualmente os votos com base nos resultados, seria mais rápido do que ter que verificar manualmente a idade de cada conta e os votos deles.
Aqui está uma consulta para definir um nĂvel de confiança mĂnimo para os usuários.
-- [params]
-- post_id :post_id
-- text :poll_name = poll
-- integer :min_trust_level
SELECT u.id AS user_id, u.username, v.poll_option_id AS option_id, o.html AS option_html
FROM polls p
JOIN poll_votes v ON (p.id = v.poll_id)
JOIN poll_options o ON (o.id = v.poll_option_id)
JOIN users u ON (v.user_id = u.id)
WHERE p.post_id = :post_id AND p.name = :poll_name
AND u.trust_level >= :min_trust_level
ORDER BY u.username, v.poll_option_id
E aqui está uma consulta para mostrar apenas os usuários que se registraram há um determinado número de dias.
-- [params]
-- post_id :post_id
-- text :poll_name = poll
-- integer :days_ago = 30
SELECT u.id AS user_id, u.username, v.poll_option_id AS option_id, o.html AS option_html
FROM polls p
JOIN poll_votes v ON (p.id = v.poll_id)
JOIN poll_options o ON (o.id = v.poll_option_id)
JOIN users u ON (v.user_id = u.id)
WHERE p.post_id = :post_id AND p.name = :poll_name
AND u.created_at < NOW() - INTERVAL ':days_ago days'
ORDER BY u.username, v.poll_option_id
Sensacional
@gerhard, obrigado!
Observe que esta consulta agora está incluĂda nas consultas padrĂŁo do Data Explorer que sĂŁo instaladas automaticamente, entĂŁo vocĂŞ nĂŁo precisa inserir esse cĂłdigo manualmente!
Outra maneira de encontrar o ID da postagem, especialmente se for a primeira postagem, Ă© verificar <topic_url>.json (por exemplo, Is it possible to see who voted in polls?). É bastante fácil encontrar o ID da postagem no inĂcio desse JSON.
@nbianca vocĂŞ pode adicionar Ă sua lista um novo parâmetro de enquete min_trust_level que permita aos criadores de enquetes restringir quem pode votar com base no nĂvel de confiança deles?
A opção deve estar disponĂvel na interface do construtor de enquetes e deve haver uma mensagem clara explicando por que alguns usuários nĂŁo podem votar nessa enquete.
Você nem precisa encontrar o post_id, pois agora há um botão de exportação em enquetes para a equipe.
Isso foi implementado, mas de forma um pouco diferente do solicitado. As enquetes aceitam uma opção groups, e nĂŁo min_trust_level, que aceita uma lista de nomes de grupos separados por vĂrgula (ou seja, trust_level_2,staff para permitir nĂveis de confiança 2+ e todos os membros da equipe).
Sinto muito, mas isso está muito confuso para mim. Você pode me explicar de forma mais simples?