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