Discourse 데이터 일반 팁

이것은 쿼리를 작성할 때 더 정확한 결과를 얻을 수 있도록 도와주는 Discourse 데이터의 몇 가지 특이한 점에 대한 좋은 예시입니다.

대부분의 게시물과 주제는 삭제 시 '소프트 삭제’되므로 데이터베이스에 여전히 남아 있으며 커스텀 보고서 통계에 포함될 수 있습니다. 따라서 사용자나 카테고리 통계와 같이 가져오려는 결과에서 이러한 항목을 필터링하여 제외하는 것이 도움이 될 수 있습니다. 비슷한 방식으로, 개인 메시지와 시스템 사용자도 통계에서 제외하는 것이 좋습니다.

이러한 항목을 필터링하는 방법에 대한 몇 가지 팁은 다음과 같습니다:

이 SQL 쿼리는 시스템 사용자를 제외하고 가장 많은 공개 게시물을 작성한 상위 10명의 사용자를 가져오기 위해 사용됩니다. 삭제된 게시물 또는 삭제된 주제에 속하는 게시물은 제외됩니다.

-- posts 테이블에서 user_id를 선택하고 각 사용자가 작성한 게시물 수를 카운트합니다
SELECT 
    p.user_id,
    COUNT(p.id) AS "Post Count"
FROM posts p
  -- topic_id 기준으로 topics 테이블과 Left join 수행
  LEFT JOIN topics t ON t.id = p.topic_id
WHERE 
  -- 개인 메시지 주제 제외
  t.archetype <> 'private_message'
  -- 삭제된 주제 제외
  AND t.deleted_at ISNULL
  -- 삭제된 게시물 제외
  AND p.deleted_at ISNULL
  -- 속삭임(whispers), 작은 액션 게시물, 관리자 게시물 제외
  AND p.post_type = 1
  -- 시스템 사용자 및 discobot(user_id 0과 -1)이 작성한 게시물 제외
  AND p.user_id > 0
-- 결과를 user_id 기준으로 그룹화
GROUP BY 1
-- 결과를 게시물 수 기준으로 내림차순 정렬
ORDER BY 2 DESC
-- 게시물 수가 가장 많은 상위 10명의 사용자로 결과 제한
LIMIT 10

인라인 주석 없이 작성된 버전은 다음과 같습니다:

SELECT 
    p.user_id,
    COUNT(p.id) AS "Post Count"
FROM posts p
  LEFT JOIN topics t ON t.id = p.topic_id
WHERE t.archetype <> 'private_message'
  AND t.deleted_at ISNULL
  AND p.deleted_at ISNULL
  AND p.post_type = 1
  AND p.user_id > 0
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10

이것은 예시를 보여주기 위한 단순한 쿼리일 뿐이지만, 데이터 탐색기를 시작하는 데 도움이 되기를 바랍니다. :+1: 질문이 있다면 아래에 남겨주세요. :slight_smile:

여기서 'messages(메시지)'를 의미하신 건가요?

any posts, or posts from[…]

나에게는 좀 이상하게 들립니다.

그렇게 생각되지 않아요? 삭제된 토픽에 있는 게시물이 포함되지 않음을 전달하려는 의도거든요. 'messages’라고 하면 개인 메시지(PM)를 가리키는 것처럼 들릴 수 있어요. 그래도 더 명확하게 표현할 방법을 다시 한번 살펴볼게요. :+1:


또 다른 생각인데 -

이 부분에도 AND p.post_type = 1을 포함하는 것이 좋을 것 같아요. :thinking:

PM도 함께 필터링하기 때문일 수도 있겠다고 생각했어요.

메시지, 삭제된 게시물, 삭제된 토픽의 게시물을 제외합니다.

이 표현이

삭제된 게시물, 또는 삭제된 토픽의 게시물을 제외합니다.

보다 훨씬 합리적으로 느껴졌거든요.

다시 읽어보니 원래 의도가 무엇이었는지 이해는 되네요. 다만, 제가 기대했던 만큼 명확하지는 않다는 생각이 듭니다. :person_shrugging: