Obter contagem de sinalizações recentes em uma categoria específica

Olá a todos :grinning:

Estou trabalhando na adição de um plugin à minha instância do Discourse que determina se um certo número de sinalizações foi feito recentemente em uma categoria. Idealmente, ele retornaria a contagem de sinalizações dadas em uma categoria em um intervalo de tempo (por exemplo, número de sinalizações nos últimos 20 minutos para a categoria com id X).

Estou brincando com o plugin Data Explorer, mas não sou muito familiarizado com SQL e não tenho certeza se o que estou tentando fazer é possível. Parece que eu poderia conseguir isso em uma base por postagem usando a tabela post_actions, pois o post_id é armazenado para ações de postagem. Idealmente, eu conseguiria isso em uma única consulta em vez de somar manualmente as contagens de sinalização para postagens individuais em uma categoria.

Se alguém puder ajudar, ficarei grato!

Olá @tpsReports,

Não tenho uma instância robusta do Discourse disponível onde possa testar isso completamente, mas acho que esta consulta do Data Explorer pode te ajudar a ir na direção certa. (Alguém provavelmente poderá dar uma sugestão para aprimorá-la!)

SELECT count(*)
FROM post_actions AS pac
JOIN posts p on p.id = pac.post_id
JOIN topics t on t.id = p.topic_id
WHERE pac.post_action_type_id in ('3','4','7','8')
AND pac.created_at >= NOW() - INTERVAL '20 MINUTE'
AND t.category_id = '4'

Neste exemplo, especifiquei o tempo desde a criação da bandeira como 20 minutos (linha 6), pois foi o que você deu em seu exemplo.
Na 7ª linha, usei o ID da categoria 4, mas você precisará usar o ID específico da categoria que deseja rastrear.

Se você quiser poder se referir à categoria pelo nome, pode adicionar outra junção à consulta, ficando assim:

SELECT count(*)
FROM post_actions AS pac
JOIN posts p on p.id = pac.post_id
JOIN topics t on t.id = p.topic_id
JOIN categories c on c.id = t.category_id
WHERE pac.post_action_type_id in ('3','4','7','8')
AND pac.created_at >= NOW() - INTERVAL '20 MINUTE'
AND c.name = 'General'

Em seguida, substitua onde usei General na linha 8 pelo nome da sua categoria. Lembre-se de que os nomes das categorias diferenciam maiúsculas de minúsculas.

Por favor, me diga se isso ajuda!

4 curtidas

@southpaw Me pegou; eu estava prestes a postar :smile:

Se você estiver interessado, adicionei campos personalizados que você pode preencher:

--[params]
-- int_list :category_ids
-- text :interval = 20min

SELECT t.category_id, count(pa.id) count
from post_actions pa
INNER JOIN posts p on p.id = pa.post_id
INNER JOIN topics t on t.id = p.topic_id
WHERE post_action_type_id in (3, 4, 6, 7, 8)
    AND t.category_id in (:category_ids)
    AND pa.created_at >= now() - interval :interval
GROUP BY t.category_id

Você pode inserir vários IDs de categoria e intervalos personalizados (como 1h, 30 min, 3 meses, etc.)

Observação: Mantive the post_action_type_id 6, que acredito estar relacionado a um usuário recebendo um aviso; não tenho certeza se você quer contar também; sinta-se à vontade para removê-lo então.

3 curtidas

Apenas para informar, mas 6 é ‘Notificar Usuário’, que é o para um PM de usuário para usuário iniciado no menu de sinalização: :+1:

Embora seja possível para um moderador marcá-lo como um aviso oficial.

3 curtidas

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.