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، بحيث لا تظهر المستخدمين الذين تقل مستويات ثقتهم أو عمر حساباتهم عن حد معين في الاستعلام؟

حتى لو اضطررتُ إلى حساب الأصوات يدويًا بناءً على النتائج، فسيكون ذلك أسرع من الاضطرار إلى التحقق يدويًا من عمر كل حساب و أصواته.

إليك استعلام لتحديد مستوى ثقة أدنى للمستخدمين.

-- [المعاملات]
-- 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

وهنا استعلام لعرض المستخدمين فقط الذين سجلوا قبل عدد معين من الأيام.

-- [المعاملات]
-- 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 شكرًا لك!

يُرجى ملاحظة أن هذا الاستعلام مُدرج الآن ضمن استعلامات مستكشف البيانات الافتراضية التي يتم تثبيتها تلقائيًا، لذا لا حاجة لإدخال هذا الكود يدويًا!

طريقة أخرى لمعرفة معرف المنشور، خاصة إذا كان أول منشور، هي الاطلاع على <topic_url>.json (على سبيل المثال، Is it possible to see who voted in polls?). من السهل جدًا العثور على معرف المنشور في بداية ملف json هذا.

@nbianca هل يمكنك إضافة معامل جديد في قائمتك يُسمى min_trust_level يسمح لمُنشئ الاستطلاع بتقييد من يمكنه التصويت بناءً على مستوى الثقة الخاص بهم؟

يجب أن تكون هذه الخيارات متاحة في واجهة مستخدم منشئ الاستطلاعات، ويجب أن تظهر رسالة واضحة تشرح سبب عدم قدرة بعض المستخدمين على التصويت في هذا الاستطلاع.

لا تحتاج حتى إلى العثور على معرف المنشور، حيث توجد الآن زر تصدير في الاستطلاعات للموظفين.

تم تنفيذ هذا الطلب، لكن بطريقة مختلفة قليلاً عما طُلب. تقبل الاستطلاعات خيار groups بدلاً من min_trust_level، والذي يقبل قائمة بأسماء المجموعات مفصولة بفواصل (مثل trust_level_2,staff للسماح للمستوى TL2+ وجميع أعضاء الطاقم).

أنا آسف، لكن هذا مربك جدًا بالنسبة لي، هل يمكنك تبسيطه لي؟