Utenti che non hanno votato in un sondaggio

Può essere molto difficile convincere gli utenti a votare in un sondaggio, soprattutto se si vogliono coinvolgere i visitatori più occasionali che passano di tanto in tanto.

A questo scopo, trovo molto utile sapere chi non ha ancora votato in un sondaggio. Questo mi permette di contattarli facilmente, senza infastidire coloro che hanno già votato.

Ho affinato questa query per renderla facile da usare dall’URL dell’argomento/post, poiché post.id è davvero un problema! E poll.name di solito è impostato di default su ‘poll’ se c’è solo un sondaggio per post. Include gli indirizzi email, per consentire l’invio di email dirette se necessario. Ma questo potrebbe essere facilmente rimosso.

-- [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  -- genera errore se 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  -- genera errore se poll_count = 0
  AND NOT EXISTS (SELECT 1 FROM voters v WHERE v.voter_id = u.id)
ORDER BY u.username
2 Mi Piace