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. ![]()
アカウントの年齢に基づいて結果をフィルタリングする方法はありますか?
例えば、アカウント作成から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
素晴らしいです
@gerhard ありがとう!
このクエリは、自動的にインストールされる標準のデータエクスプローラークエリにすでに含まれていますので、このコードを手動で入力する必要はありません!
特に最初の投稿の場合、post_id を探すもう一つの方法は、<topic_url>.json(例:https://meta.discourse.org/t/is-it-possible-to-see-who-voted-in-polls/27064.json)を確認することです。その JSON の冒頭部分に post_id が簡単に見つかります。
@nbianca 新しい投票パラメータ min_trust_level をリストに追加していただけますか?これにより、投票の作成者がユーザーの信頼レベルに基づいて投票者を制限できるようになります。
このオプションは投票ビルダー UI で利用可能とし、特定のユーザーがその投票に投票できない理由を説明する分かりやすいメッセージも表示されるようにしてください。
スタッフ向けに投票にエクスポートボタンが追加されたため、投稿 ID を探す必要さえありません。
この機能は実装されましたが、リクエストとは少し異なる形となっています。アンケートは min_trust_level ではなく、groups オプションを受け付けます。このオプションには、グループ名のリストをカンマ区切りで指定します(例: trust_level_2,staff とすると、TL2 以上およびすべてのスタッフメンバーが投票可能になります)。
申し訳ありませんが、これは私にはあまりにも混乱しています。詳しく説明していただけますか?