Is it possible to see who voted in polls?

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.

Query for Discourse v2.2.0.beta5 and newer

-- [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

Query for older versions of Discourse up to v2.2.0.beta4

-- [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

How to find post_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. :fireworks:

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. :slight_smile:

계정 가입 기간을 기준으로 결과를 필터링하는 방법이 있을까요?

예를 들어, 가입 기간이 60일 미만인 계정은 결과에 표시되지 않도록 할 수 있나요? 아니면 계정 가입 기간에 따라 투표할 수 있는 사람을 제한하는 투표(설문)를 만드는 방법이 있을까요?

다가오는 중요한 투표에서 새로 생성된 계정으로 인한 부정을 방지하려고 합니다.

정말 흥미로운 사용 사례네요. TL0 사용자의 투표 참여를 방지할 수 있는 옵션을 제공해야 한다고 생각합니다 @zogstrip!

@gerhard님이 작성하신 검색 문자열에 특정 신뢰 수준 또는 계정 연령 미만의 사용자를 쿼리에서 제외할 수 있는 매개변수가 있을까요?

결과를 기반으로 수동으로 투표수를 집계해야 한다고 해도, 모든 계정의 연령과 그들의 투표를 수동으로 확인하는 것보다 훨씬 빠를 것입니다.

다음은 사용자에게 최소 신뢰 수준을 설정하는 쿼리입니다.

-- [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

다음은 특정 일수 전에 가입한 사용자만 표시하는 쿼리입니다.

-- [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

대단해요 :heart_eyes: @gerhard 감사합니다!

이 쿼리는 이제 자동으로 설치되는 기본 Data Explorer 쿼리에 포함되어 있으므로, 이 코드를 직접 입력할 필요가 없습니다!

특히 첫 번째 게시물의 경우, <topic_url>.json(예: Is it possible to see who voted in polls?)을 확인하여 게시물 ID를 찾는 또 다른 방법이 있습니다. 해당 JSON의 맨 앞부분에서 게시물 ID를 찾는 것은 비교적 쉽습니다.

@nbianca 목록에 새 투표 파라미터 min_trust_level을 추가해 주시겠어요? 이 파라미터는 투표 생성자가 신뢰 수준에 따라 누가 투표할 수 있는지를 제한할 수 있도록 해 줍니다.

해당 옵션은 투표 빌더 UI에서 사용 가능해야 하며, 일부 사용자가 해당 투표에 참여할 수 없는 이유를 설명하는 친절한 메시지도 함께 표시되어야 합니다.

지금 관리자를 위한 투표에 내보내기 버튼이 있으므로 post_id를 찾을 필요가 전혀 없습니다.

요청과는 조금 다른 방식으로 구현되었습니다. 투표는 min_trust_level 대신 쉼표로 구분된 그룹 이름 목록을 받는 groups 옵션을 지원합니다. (예: trust_level_2,staff는 TL2 이상 및 모든 스태프 멤버에게 허용)

죄송하지만 제게 너무 복잡하고 혼란스럽습니다. 조금 더 쉽게 설명해 주시겠어요?