Получить количество недавних флагов в определённой категории

Всем привет :grinning:

Я работаю над добавлением плагина к моему экземпляру Discourse, который определяет, было ли недавно подано определённое количество жалоб в категории. В идеале он должен возвращать количество жалоб, поданных в категории за определённый период времени (например, количество жалоб за последние 20 минут для категории с идентификатором X).

Я экспериментирую с плагином Data Explorer, но я не очень хорошо знаком с SQL и не уверен, возможно ли то, что я пытаюсь сделать. Кажется, что это можно реализовать для каждого сообщения отдельно, используя таблицу post_actions, так как там хранится post_id. В идеале я хотел бы выполнить это в одном запросе, вместо того чтобы вручную суммировать количество жалоб для отдельных сообщений в категории.

Если кто-то сможет помочь, буду очень благодарен!

Привет, @tpsReports,

У меня нет достаточно мощного экземпляра Discourse для тщательного тестирования, но, думаю, этот запрос Data Explorer поможет вам двигаться в правильном направлении. (Кто-то другой, вероятно, сможет помочь его оптимизировать!)

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'

В этом примере я указал время с момента создания флага равным 20 минутам (строка 6), так как именно это вы привели в своём примере.
В седьмой строке я использовал идентификатор категории 4, но вам нужно будет подставить конкретный идентификатор категории, которую вы хотите отслеживать.

Если вы хотите иметь возможность ссылаться на категорию по имени, можно добавить ещё одно соединение (JOIN) к запросу, тогда он будет выглядеть так:

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'

Затем замените слово General в строке 8 на название вашей категории. Помните, что названия категорий чувствительны к регистру.

Дайте знать, если это поможет!

@southpaw Вы меня опередили; я уже собирался написать :smile:

Если интересно, я добавил пользовательские поля, которые вы можете заполнить:

--[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

Вы можете указать несколько идентификаторов категорий и пользовательские интервалы (например, 1ч, 30 мин, 3 месяца и т. д.)

Примечание: Я оставил post_action_type_id 6, который, как я полагаю, связан с получением пользователем предупреждения; не уверен, нужно ли вам его учитывать; если нет, просто удалите его.

Просто к сведению: значение 6 — это «Уведомить пользователя», то есть для личных сообщений между пользователями, инициированных из меню флагов: :+1:

Хотя модератор может пометить это как официальное предупреждение.