그룹별로 사용자 정보를 빠르게 가져올 수 있는 간단한 방법으로 아래 쿼리를 작성했습니다. 이 쿼리는 다른 분들의 제안과, 저보다 SQL을 훨씬 깊이 있게 이해하시는 분의 도움을 받아 급하게 만든 것입니다.
그룹을 복제하거나, 이미 그룹에 속한 사람들에게 관찰(watching) 설정을 적용하거나, 그룹에 구식 이메일을 보내거나, 모든 사용자 데이터를 덤프하지 않고 커스텀 필드에 어떤 값이 있는지 확인하거나, 특정 그룹에만 일부 정보를 공개하는 등 다양한 상황에서 유용하게 사용할 수 있습니다.
코드 내 주석에 따라 관리자 직접 링크나 커스텀 필드를 커스터마이즈할 수 있습니다.
현재 Meta에는 Data Explorer 쿼리를 위한 좋은 저장소가 없는 것 같습니다. 이곳에 공유하는 것이 괜찮을지 모르겠네요.
--[params]
-- string :group_name
With included_users AS (
SELECT
gu.user_id
FROM group_users gu
JOIN groups g
ON g.id = gu.group_id
WHERE g.name = :group_name
),
e AS (
SELECT email, user_id
FROM user_emails u
WHERE u.primary = true
)
SELECT
u.id AS user_id, u.name, u.username, e.email
-- 다음 줄은 사용자의 관리자 패널에 대한 직접 링크를 제공합니다
-- concat('/admin/users/',u.id,'/',u.username) AS admin_access_url
-- 아래 MAX가 포함된 줄은 사용자 커스텀 필드를 가져오는 데 사용할 수 있으며, 필요에 따라 복제하세요
-- '필드 이름'과 "표시 이름"을 대상 필드로 교체하세요
-- MAX(CASE ucf.name WHEN '필드 이름' THEN value END) AS "표시 이름"
-- *마지막 필드를 제외한 모든 필드 뒤에 쉼표가 있는지 확인하세요*
FROM users as u
LEFT JOIN user_custom_fields AS ucf on u.id = ucf.user_id
RIGHT JOIN e on u.id = e.user_id
RIGHT JOIN user_fields AS uf on concat('user_field_', uf.id) = ucf.name
WHERE u.id IN (SELECT user_id FROM included_users)
GROUP BY u.id, e.email
ORDER BY u.username asc