Usuários que não votaram em uma enquete

Pode ser muito difícil convencer seus usuários a votar em uma enquete — especialmente se você quiser alcançar seus visitantes mais casuais, que só passam por lá de vez em quando.

Para isso, acho muito útil saber quem ainda não votou em uma enquete. Isso me permite persegui-los facilmente, sem incomodar aqueles que já votaram.

Refinei esta consulta para facilitar o uso a partir da URL do Tópico/Postagem, pois post.id é realmente uma dor de cabeça! E poll.name geralmente é ‘poll’ por padrão se houver apenas uma por postagem de qualquer maneira. Inclui endereços de e-mail para permitir e-mails diretos, se necessário. Mas isso pode ser facilmente removido.

-- [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  -- gera erro 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  -- gera erro se poll_count = 0
  AND NOT EXISTS (SELECT 1 FROM voters v WHERE v.voter_id = u.id)
ORDER BY u.username
1 Curtiu