설문에 투표하지 않은 사용자

사용자들이 투표에 참여하도록 하는 것은 매우 어려울 수 있습니다. 특히 가끔만 방문하는 가벼운 방문자들을 끌어들이고자 할 때 더욱 그렇습니다.

이를 위해, 아직 투표를 하지 않은 사용자를 파악하는 것이 매우 유용합니다. 이렇게 하면 이미 투표를 한 사용자에게 부담을 주지 않으면서도 쉽게 추적을 할 수 있습니다.

post.id가 매우 귀찮기 때문에, 이 쿼리를 주제/게시물 URL에서 쉽게 사용할 수 있도록 개선했습니다. 또한 게시글당 보통 하나의 투표만 있으므로 poll.name은 기본적으로 'poll’로 설정되어 있습니다. 필요 시 직접 이메일을 보낼 수 있도록 이메일 주소를 포함하고 있습니다. 하지만 쉽게 제거할 수도 있습니다.

-- [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  -- 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  -- poll_count = 0이면 오류 발생
  AND NOT EXISTS (SELECT 1 FROM voters v WHERE v.voter_id = u.id)
ORDER BY u.username
3개의 좋아요