대시보드 보고서 - 플래그

이것은 플래그에 대한 대시보드 보고서의 SQL 버전입니다

이 보고서는 주어진 날짜 범위 내에서 선택적으로 특정 카테고리(그 하위 카테고리 포함) 안의 플래그된 게시물의 수를 제공합니다. 이 정보는 커뮤니티 관리자 및 모더레이터가 포럼의 특정 부분에서 제기된 플래그의 양을 이해하는 데 유용하며, 이를 통해 추세를 파악하고 추가적인 주의나 모더레이션이 필요한 영역을 식별하는 데 도움이 될 수 있습니다.

-- [params]
-- date :start_date = 2023-01-01
-- date :end_date = 2024-01-01
-- null int :category_id = 0
-- boolean :include_subcategories = false

WITH RECURSIVE subcategories AS (
    SELECT id FROM categories WHERE id = :category_id
    UNION ALL
    SELECT c.id FROM categories c
    INNER JOIN subcategories sc ON c.parent_category_id = sc.id
)

SELECT
    DATE(r.created_at) AS flag_date,
    COUNT(r.id) AS flags_count
FROM reviewables r
LEFT JOIN categories c ON r.category_id = c.id
WHERE r.type = 'ReviewableFlaggedPost'
    AND r.created_at::DATE BETWEEN :start_date AND :end_date
    AND (:category_id = 0 OR (
        :include_subcategories
        AND r.category_id IN (SELECT id FROM subcategories)
        OR NOT :include_subcategories
        AND r.category_id = :category_id
    ))
GROUP BY flag_date
ORDER BY flag_date

SQL 쿼리 설명

이 SQL 쿼리는 지정된 날짜 범위 및 카테고리 내에서 각 날짜에 생성된 플래그(reviewables 테이블의 ReviewableFlaggedPost 레코드에 해당)의 수를 계산하도록 설계되었습니다. 선택된 카테고리의 하위 카테고리를 포함하도록 재귀적 공통 테이블 표현식(CTE)을 사용합니다.

매개변수

  • :start_date: 플래그를 계산할 날짜 범위의 시작일.
  • :end_date: 플래그를 계산할 날짜 범위의 종료일.
  • :category_id: 플래그를 계산할 카테고리의 ID. 0으로 설정하면 카테고리 필터가 적용되지 않습니다.
  • :include_subcategories: 지정된 카테고리의 하위 카테고리를 계산에 포함할지 여부를 결정하는 부울 값.

쿼리 분해

  1. 재귀적 CTE (subcategories):
  • 이 CTE는 :category_id 매개변수로 제공된 ID를 가진 카테고리를 선택하여 시작합니다.
  • 그런 다음 categories 테이블을 parent_category_id 필드를 기준으로 subcategories CTE와 조인하여 해당 카테고리의 모든 하위 카테고리를 재귀적으로 선택합니다.
  • 결과는 필터링에 사용될 모든 하위 카테고리(초기 카테고리 포함)의 목록입니다.
  1. 주 쿼리:
  • 쿼리는 두 개의 열을 선택합니다: 플래그 생성 날짜(flag_date) 및 해당 날짜의 플래그 수(flags_count).
  • 각 플래그를 해당 카테고리와 연결하기 위해 reviewables 테이블을 categories 테이블과 조인합니다.
  1. 필터:
  • 쿼리는 reviewables 레코드 중 플래그된 게시물을 나타내는 ReviewableFlaggedPost 유형만 포함하도록 필터링합니다.
  • 플래그의 created_at 날짜가 지정된 날짜 범위(:start_date에서 :end_date까지) 내에 있는지 확인합니다.
  • :category_id 및 :include_subcategories 매개변수에 기반하여 조건부 필터를 적용합니다:
    • :category_id가 0이면 카테고리 필터가 적용되지 않습니다.
    • :include_subcategories가 true이면 쿼리는 초기 카테고리와 그 모든 하위 카테고리의 플래그를 포함합니다.
    • :include_subcategories가 false이면 쿼리는 초기 카테고리의 플래그만 포함합니다.
  1. 그룹핑 및 정렬:
  • 결과는 플래그 생성 날짜별로 그룹화되어 하루 단위의 수를 제공합니다.
  • 결과는 날짜 순서로 정렬되어 데이터를 시간 순서대로 제시합니다.

결과 예시

flag_date flags_count
2023-11-19 2
2023-11-22 1
2023-11-23 1
2023-11-24 2
2023-11-26 1
… …
1개의 좋아요