Este é um relatório de painel em versão SQL para Sinalizações
Este relatório fornece uma contagem de postagens sinalizadas dentro de uma categoria específica opcional (e opcionalmente suas subcategorias) em um determinado intervalo de datas. Essas informações podem ser úteis para gerentes de comunidade e moderadores entenderem o volume de sinalizações levantadas em certas partes do fórum, o que pode ajudar a identificar tendências e áreas que podem exigir atenção ou moderação adicionais.
-- [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
Explicação da Consulta SQL
A consulta SQL foi projetada para contar o número de sinalizações (que são representadas por registros ReviewableFlaggedPost na tabela reviewables) criadas em cada data dentro do intervalo de datas e categoria especificados. Ela usa uma Expressão de Tabela Comum (CTE) recursiva para incluir opcionalmente subcategorias da categoria escolhida.
Parâmetros
:start_date: O início do intervalo de datas para o qual contar as sinalizações.:end_date: O fim do intervalo de datas para o qual contar as sinalizações.:category_id: O ID da categoria para a qual contar as sinalizações. Se definido como 0, o filtro por categoria não é aplicado.:include_subcategories: Um valor booleano que determina se as subcategorias da categoria especificada devem ser incluídas na contagem.
Detalhamento da Consulta
- CTE Recursiva (
subcategories):- Esta CTE começa selecionando a categoria com o ID fornecido pelo parâmetro
:category_id. - Em seguida, seleciona recursivamente todas as subcategorias dessa categoria, unindo a tabela
categoriescom a CTEsubcategoriesno campoparent_category_id. - O resultado é uma lista de todas as subcategorias (incluindo a categoria inicial) que serão usadas para filtragem.
- Esta CTE começa selecionando a categoria com o ID fornecido pelo parâmetro
- Consulta Principal:
- A consulta seleciona duas colunas: a data de criação da sinalização (
flag_date) e a contagem de sinalizações (flags_count) para essa data. - Ela une a tabela
reviewablescom a tabelacategoriespara associar cada sinalização à sua categoria.
- A consulta seleciona duas colunas: a data de criação da sinalização (
- Filtros:
- A consulta filtra os registros de
reviewablespara incluir apenas aqueles do tipoReviewableFlaggedPost, que representa postagens sinalizadas. - Ela garante que a data
created_atdas sinalizações esteja dentro do intervalo de datas especificado (:start_datea:end_date). - Ela aplica um filtro condicional com base nos parâmetros
:category_ide:include_subcategories:- Se
:category_idfor 0, nenhum filtro de categoria é aplicado. - Se
:include_subcategoriesfortrue, a consulta inclui sinalizações da categoria inicial e de todas as suas subcategorias. - Se
:include_subcategoriesforfalse, a consulta inclui sinalizações apenas da categoria inicial.
- Se
- A consulta filtra os registros de
- Agrupamento e Ordenação:
- Os resultados são agrupados pela data de criação da sinalização para fornecer uma contagem por dia.
- Os resultados são ordenados por data para apresentar os dados em uma sequência cronológica.
Exemplo de Resultados
| flag_date | flags_count |
|---|---|
| 2023-11-19 | 2 |
| 2023-11-22 | 1 |
| 2023-11-23 | 1 |
| 2023-11-24 | 2 |
| 2023-11-26 | 1 |
| … | … |