User_ID별로 사용자 이메일 목록 내보내기

안녕하세요,

이 정보가 이미 다른 곳에 있다면 죄송합니다. 찾아보았지만 확실한 답변을 찾지 못했습니다.

사용자 이름 또는 사용자 ID를 사용하여 사용자의 이메일 주소를 대량으로 찾는 가장 쉬운 방법을 알아보고 있습니다. 저는 사이트 관리자로서 필요한 권한을 보유하고 있으며, 사용자 프로필에서 이 정보를 찾을 수 있다는 것도 알고 있습니다. 하지만 잠재적으로 수천 명의 사용자에게 이 작업을 수행해야 합니다.

문제는 불행히도 우리가 진행하던 투표에 참여하기 위해 수천 개의 봇 계정이 생성되었고, 최종 집계 결과를 정확히 정리하여 수상자를 적절히 결정해야 한다는 점입니다. Poll results report Data Explorer 쿼리를 사용하여 투표 결과를 가져왔지만, 이 쿼리는 사용자 이메일을 반환하지 않습니다. Data Explorer 플러그인을 위한 다른 쿼리를 작성하면 ID나 사용자 이름 목록을 받아서 해당하는 이메일 목록을 반환할 수 있을 것이라 추측합니다. 하지만 저는 SQL에 익숙하지 않아서 어떻게 해야 할지 막막합니다.

누군가 올바른 방향으로 안내해 주시거나 이 정보를 얻는 더 나은 방법이 있다면 제안해 주시면 감사하겠습니다!

감사합니다.

https://ask.discourse.com/에 접속하여 검색어를 입력하고, 사용자 이메일이 필요하다고 말씀해 주세요. (사용자 이메일 주소를 가져오려면, 이미 가지고 있다고 생각하는 user_id를 UserEmails 테이블과 조인해야 합니다)

어떤 이유에선지 그 사실을 몰랐습니다. 바로 문제가 해결되었으니 정말 감사합니다!

참고로 작동하는 쿼리는 다음과 같습니다:

SELECT users.id AS user_id, user_emails.email
FROM users
LEFT JOIN user_emails ON users.id = user_emails.user_id AND user_emails.primary
WHERE users.id IN (/* 여기 사용자 ID 목록을 넣으세요. 예: 1,2,3 */)

더 지능적인 방식으로 "사용자 목록"을 다른 select로 채울 수 있다고 생각합니다.

설문조사 결과에서 쿼리를 가져와서 둘을 결합할 수 있는지 물어보세요.

네, 저도 그렇게 생각했어요. 이 문제를 해결하기에는 초기 쿼리만으로도 충분했지만, 향후를 위해 투표 결과 쿼리에 이메일이 반환되는 것은 유용할 것입니다.

제안해 주신 대로 AI에게 진행을 맡겼습니다. 특정 투표를 선택할 수 있도록 조금 조정해서 다음 코드를 얻었습니다:

-- [params]
-- int :topic_id
-- int :post_number
-- text :poll_name

SELECT polls.name AS "Poll Name",
       poll_options.html AS "Answer",
       poll_votes.user_id AS "User ID",
       users.username AS "Username",
       user_emails.email AS "Email"
FROM poll_options
INNER JOIN poll_votes ON poll_options.id = poll_votes.poll_option_id
INNER JOIN polls ON polls.id = poll_votes.poll_id
INNER JOIN users ON users.id = poll_votes.user_id
LEFT JOIN user_emails ON users.id = user_emails.user_id AND user_emails.primary
WHERE poll_options.poll_id IN (
    SELECT polls.id FROM polls
    WHERE polls.post_id = (
      SELECT posts.id FROM posts WHERE topic_id = :topic_id AND post_number = :post_number
    ) AND polls.name = :poll_name
)
ORDER BY polls.name, poll_options.html

정상적으로 작동하는 것 같습니다. 조언해 주셔서 다시 한번 감사합니다!

내가 AI에게 뭘 해야 할지 지시할 내용을 알려주는 건, 그야말로 차원 높은 바이브 코딩(vibe coding)이죠! :rofl:

이것을 다음과 같이 단순화할 수 있을 것 같습니다 (또한 데이터 탐색기의 마법 같은 기능도 활용하고요):

-- [params]
-- post_id :post_url
-- text :poll_name = poll

SELECT 
    pv.user_id,
    po.html AS answer,
    ue.email
FROM poll_options po
  JOIN poll_votes pv ON po.id = pv.poll_option_id
  JOIN polls p ON p.id = pv.poll_id
  JOIN user_emails ue ON pv.user_id = ue.user_id AND ue.primary
WHERE p.post_id = :post_url
  AND p.name = :poll_name
ORDER BY po.html

post_id 파라미터 유형을 사용하면 게시글 URL을 붙여넣으면 해당 post_id를 가져올 수 있습니다 (예: https://meta.discourse.org/t/export-a-list-of-user-emails-by-user-id/373768/5). 그리고 게시글에 있는 대부분의 단일 투표는 같은 게시글에 두 번째 투표를 추가하거나 수동으로 추가하지 않는 한 단순히 'poll’이라고 이름 붙여지므로, :poll_name의 기본값으로 설정하는 것이 유용해 보였습니다.

또한 user_id에는 마법 같은 기능이 있어, 단순히 순수한 사용자 ID를 표시하는 대신 사용자 카드/프로파일로 연결되는 아바타와 사용자 이름 링크를 표시합니다. 이는 결과를 '사이트 내’에서 확인할 때 매우 유용하지만, 내보내기를 계획하고 있다면 사용자 이름의 텍스트 버전을 얻으려면 users 테이블을 다시 추가해야 합니다.