저는 Discourse 인스턴스에 플러그인을 추가하는 작업을 하고 있습니다. 이 플러그인은 특정 카테고리에서 최근 특정 수의 플래그가 생성되었는지 여부를 판단하는 것입니다. 이상적으로는 시간 범위(예: ID가 X인 카테고리에서 지난 20분 동안의 플래그 수) 동안 해당 카테고리에서 생성된 플래그의 개수를 반환해야 합니다.
현재 Data Explorer 플러그인을 활용해 보고 있지만, SQL에 익숙하지 않아 제가 하려는 것이 가능한지 확신이 서지 않습니다. post_actions 테이블에는 post_id가 저장되어 있으므로 게시글 단위로 이 작업을 수행할 수 있을 것 같습니다. 하지만 카테고리 내 개별 게시글의 플래그 수를 수동으로 합산하는 대신, 하나의 쿼리로 이를 해결하는 것이 이상적입니다.
제가 충분히 테스트할 수 있는 안정된 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번째 줄)으로 지정했는데, 이는 질문자님이 예시로 제시하신 값이기 때문입니다.
7번째 줄에서는 카테고리 ID로 4를 사용했지만, 추적하려는 카테고리의 특정 카테고리 ID를 사용해야 합니다.
카테고리 이름으로 참조하고 싶다면 쿼리에 다른 조인(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'
그리고 8번째 줄에서 General이라고 쓴 부분을 내 카테고리 이름으로 교체하세요. 카테고리 이름은 대소문자를 구분한다는 점을 명심하세요.
--[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
여러 카테고리 ID와 커스텀 간격(예: 1h, 30 min, 3 months 등)을 입력할 수 있습니다.