投票に参加していないユーザー

ユーザーに投票を促すのは非常に困難な場合があります。特に、たまに訪れるカジュアルなユーザーを巻き込みたい場合更是然りです。

このため、誰がまだ投票していないのかを知ることは非常に有用だと考えています。これにより、すでに投票したユーザーを煩わせることなく、未投票のユーザーに簡単にフォローアップできます。

このクエリを、トピック/投稿のURLから簡単に使用できるように改良しました。post.id は扱いにくいからです!また、投稿ごとに1つの投票しかない場合は、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
「いいね!」 1