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 alguna forma de filtrar los resultados según la antigüedad de la cuenta?
Por ejemplo, si una cuenta tiene menos de 60 días, ¿no aparecería en los resultados? O tal vez existe una manera de crear una encuesta que limite quién puede votar según la antigüedad de la cuenta.
Estamos intentando prevenir posibles manipulaciones del voto por cuentas recién creadas para una votación importante que se avecina.
Ese es un caso de uso muy interesante. Creo que deberíamos tener una opción para evitar que los usuarios TL0 voten en una encuesta, @zogstrip.
¿Hay algún parámetro que pueda agregar a la cadena de búsqueda de @gerhard para que no muestre a los usuarios por debajo de cierto nivel de confianza o antigüedad de la cuenta en la consulta?
Incluso si tuviera que sumar manualmente los votos basándome en los resultados, sería más rápido que tener que verificar manualmente la antigüedad de cada cuenta y sus votos.
Aquí tienes una consulta para establecer un nivel de confianza mínimo para los usuarios.
-- [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
Y aquí tienes una consulta para mostrar solo a los usuarios que se registraron hace cierta cantidad de días.
-- [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
¡Increíble
@gerhard, gracias!
Ten en cuenta que esta consulta ya está incluida en las consultas de Data Explorer predeterminadas que se instalan automáticamente, por lo que no necesitas ingresar este código tú mismo.
Otra forma de encontrar el ID del post, especialmente si es el primer post, es mirar <topic_url>.json (por ejemplo, Is it possible to see who voted in polls?). Es bastante fácil encontrar el ID del post al principio de ese JSON.
@nbianca ¿podrías agregar a tu lista un nuevo parámetro para las encuestas min_trust_level que permita a los creadores de encuestas restringir quién puede votar según su nivel de confianza?
La opción debe estar disponible en la interfaz del creador de encuestas y debe haber un mensaje claro que explique por qué algunos usuarios no pueden votar en esa encuesta.
Ni siquiera necesitas buscar el post_id, ya que ahora hay un botón de exportación en las encuestas para el personal.
Esto se ha implementado, pero de manera ligeramente diferente a lo solicitado. Las encuestas aceptan una opción groups, no un min_trust_level, la cual acepta una lista de nombres de grupos separados por comas (por ejemplo, trust_level_2,staff para permitir a usuarios con nivel de confianza 2 o superior y a todos los miembros del personal).
Lo siento, pero esto es demasiado confuso para mí. ¿Podrías desglosarlo para mí?