사용자 그룹별로 토픽 필터링하는 방법

포럼의 기존 주제를 최신 답변 작성자가 속한 사용자 그룹 기준으로 필터링할 수 있는 방법이 있을까요?

예를 들어, 특정 사용자 그룹을 "클라이언트"로 정의한 후, 클라이언트 사용자가 아직 답변하지 않은 모든 주제를 필터링하고 싶습니다.

도움 주시면 감사하겠습니다.

포럼에 Data Explorer 플러그인이 설치되어 있다면, SQL 쿼리를 작성하여 Discourse 데이터베이스에서 이 정보를 가져올 수 있습니다. 이 쿼리는 토픽의 ID와 제목, 그리고 해당 토픽의 마지막 게시물 작성자의 사용자 ID를 가져오도록 시도합니다. 마지막 게시물이 ‘clients’ 그룹에 속한 사용자가 작성한 토픽만 선택합니다.

이것은 예시일 뿐입니다.

SELECT 
    t.id AS topic_id, 
    t.title AS topic_title, 
    (SELECT user_id FROM posts WHERE topic_id = t.id ORDER BY created_at DESC LIMIT 1) AS last_post_user_id
FROM 
    topics t
JOIN
    posts p ON p.topic_id = t.id
JOIN 
    group_users gu ON gu.user_id = p.user_id
JOIN 
    groups g ON g.id = gu.group_id
WHERE 
    g.name = 'clients'
GROUP BY 
    t.id
HAVING 
    MAX(p.user_id) = last_post_user_id
ORDER BY 
    MAX(p.created_at) DESC

t.last_post_id이 있는지 확실하지 않습니다.

찾아줘서 고마워, topics 테이블에는 last_post_id 필드가 없거든. :face_with_spiral_eyes:

걱정하지 마세요. 수정한 버전이 잘 작동하는 것 같습니다. :+1: :slight_smile: 참고로, 삭제된 토픽/글, 개인 메시지(PM), Whispers/Small Action 게시물을 필터링하기 위해 몇 가지 추가 조건을 넣는 것도 유용할 수 있습니다. 다음과 같은 방식으로 말이죠:

SELECT 
    t.id AS topic_id, 
    t.title AS topic_title, 
    (SELECT user_id FROM posts WHERE topic_id = t.id ORDER BY created_at DESC LIMIT 1) AS last_post_user_id
FROM topics t
JOIN posts p ON p.topic_id = t.id
JOIN group_users gu ON gu.user_id = p.user_id
JOIN groups g ON g.id = gu.group_id
WHERE g.name = 'clients'
AND t.deleted_at ISNULL
AND p.deleted_at ISNULL
AND p.post_type = 1
AND t.archetype = 'regular'
GROUP BY t.id
HAVING MAX(p.user_id) = last_post_user_id
ORDER BY MAX(p.created_at) DESC

다만, 원포스터(OP)가 다시 답변을 남긴 경우(예: ‘감사합니다’ 등)는 이 쿼리로 잡히지 않을 것 같아 @kenjdarhan 님이 원하는 목적에 따라 다른 방법이 필요할 수 있습니다. 구체적으로, 클라이언트가 생성한 토픽 중 팀 멤버의 답변을 받았고 아직 해결되지 않은 것들을 찾는 건가요? 그런 식의 조건인가요?

Jammy님,

단순히 ‘클라이언트’ 사용자 그룹에 속한 사용자가 가장 최근 답변을 작성한 주제들입니다.

주제에 비클라이언트 사용자(예: 제 동료)가 답변을 남겼다면, 그 주제는 제가 신경 쓸 필요가 없습니다. 문제가 해결되지 않았다면, 답변을 남긴 동료가 해당 주제에서 문제를 해결하기 위해 계속 진행할 것이기 때문입니다.

조금 다른 것이 필요하신 것 같습니다. :slight_smile: 모든 포럼은 약간씩 다르므로 솔루션을 조정해야 할 수 있지만, 이 요청은 "‘client’ 그룹의 사용자가 생성하고 ‘team’ 그룹의 사용자가 답변하지 않은 토픽"이라고 설명하겠습니다. 그렇다면 올바른 group_ids로 이 쿼리를 조정하면 원하는 대로 작동해야 합니다:

-- [params]
-- date :start_date = 01/01/2023
-- date :end_date = 01/06/2023

WITH team_replies AS (

SELECT topic_id
FROM posts
WHERE user_id IN (SELECT user_id FROM group_users WHERE group_id = 3) -- 'team' 그룹의 group_id
  AND post_number <> 1
  AND deleted_at ISNULL
  AND post_type = 1
GROUP BY topic_id
)

 
SELECT t.created_at::date,
       t.id AS topic_id,
       MIN(p.id) AS first_post_id
FROM topics t
JOIN posts p ON p.topic_id = t.id
WHERE t.user_id IN (SELECT user_id FROM group_users WHERE group_id = 45) -- 'client' 그룹의 group_id
  AND t.id NOT IN (SELECT topic_id FROM team_replies)
  AND t.created_at BETWEEN :start_date AND :end_date
  AND t.deleted_at ISNULL
  AND t.archetype = 'regular'
GROUP BY t.id
ORDER BY 1 ASC

그룹 이름 대신 group_ids를 아는 경우 이 방식이 더 부드럽게 작동합니다. 그룹 JSON(예: /g/admins.json)에서 이를 찾을 수 있으며, 다음과 같은 간단한 조회를 사용할 수도 있습니다:


-- [params]
-- string :group_name

SELECT name,
       id
FROM groups
WHERE name LIKE LOWER (:group_name)

데이터 탐색기에 쿼리를 복사해서 붙여넣은 첫 번째에는 파라미터 입력 상자를 인식하기 위해 페이지를 새로고침해야 합니다. :+1:

제이미, 감사합니다. 그렇게 해볼게요.