Nutzer, die in einer Umfrage nicht abgestimmt haben

Es kann sehr schwierig sein, Ihre Nutzer dazu zu bringen, an einer Umfrage abzustimmen – besonders wenn Sie auch die gelegentlichen Besucher erreichen möchten, die nur sporadisch vorbeischauen.

Daher finde ich es sehr hilfreich zu wissen, wer noch nicht an einer Umfrage teilgenommen hat. So kann ich diese Personen gezielt ansprechen, ohne diejenigen zu belästigen, die bereits abgestimmt haben.

Ich habe diese Abfrage so angepasst, dass sie sich leicht über die Topic-/Post-URL verwenden lässt, da post.id sonst recht umständlich ist! Und poll.name ist ohnehin meist standardmäßig ‘poll’, wenn pro Post nur eine Umfrage existiert. Die Abfrage enthält E-Mail-Adressen, um bei Bedarf direkte E-Mails zu ermöglichen. Diese könnten jedoch leicht entfernt werden.

-- [params]
-- group_id :group_id
-- int :topic_id
-- int :post_number = 1
-- string :poll_name = poll

WITH target_post AS (
  SELECT id AS post_id
  FROM posts
  WHERE topic_id = :topic_id
    AND post_number = :post_number
),

poll_check AS (
  SELECT COUNT(*) AS poll_count
  FROM polls p
  INNER JOIN target_post tp ON tp.post_id = p.post_id
  WHERE p.name = :poll_name
),

voters AS (
  SELECT DISTINCT pv.user_id AS voter_id
  FROM poll_votes pv
  INNER JOIN polls p ON p.id = pv.poll_id
  INNER JOIN target_post tp ON tp.post_id = p.post_id
  CROSS JOIN poll_check pc
  WHERE p.name = :poll_name
    AND 1 / pc.poll_count > 0  -- errors if poll_count = 0
)

SELECT
  u.id AS user_id,
  u.username,
  ue.email
FROM users u
INNER JOIN group_users gu ON gu.user_id = u.id
INNER JOIN groups g ON g.id = gu.group_id
INNER JOIN user_emails ue ON ue.user_id = u.id AND ue.primary = TRUE
CROSS JOIN poll_check pc
WHERE g.id = :group_id
  AND u.id > 0
  AND 1 / pc.poll_count > 0  -- errors if poll_count = 0
  AND NOT EXISTS (SELECT 1 FROM voters v WHERE v.voter_id = u.id)
ORDER BY u.username
2 „Gefällt mir“