Usuarios que no han votado en una encuesta

Puede ser muy difícil conseguir que tus usuarios voten en una encuesta, especialmente si quieres captar a los visitantes más casuales que solo pasan de vez en cuando.

Para ello, encuentro muy útil saber quién aún no ha votado en una encuesta. Esto me permite perseguirlos fácilmente, sin molestar a los que ya han votado.

He refinado esta consulta para facilitar su uso desde la URL del Tema/Post, ¡ya que post.id es realmente una molestia! Y poll.name suele ser ‘poll’ por defecto si solo hay una por post de todos modos. Incluye direcciones de correo electrónico para permitir correos directos si es necesario. Pero esto podría eliminarse fácilmente.

-- [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  -- error si 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  -- error si poll_count = 0
  AND NOT EXISTS (SELECT 1 FROM voters v WHERE v.voter_id = u.id)
ORDER BY u.username
1 me gusta