特定のカテゴリにおける最近のフラグの数を取得する

こんにちは皆さん :grinning:

Discourseインスタンスにプラグインを追加して、特定のカテゴリで最近フラグが立てられた数を判断しようとしています。理想的には、時間範囲(たとえば、IDがXのカテゴリで過去20分間のフラグ数)でカテゴリ内のフラグ数を返すようにしたいです。

Data Explorerプラグインを試していますが、SQLにあまり詳しくなく、やりたいことが可能かどうか分かりません。post_idがpost actionsに保存されているため、post_actionsテーブルを使用して、投稿ごとにこれを達成できるようです。理想的には、カテゴリ内の個々の投稿のフラグ数を手動で合計するのではなく、1つのクエリでこれを達成したいと考えています。

誰か助けてくれる人がいれば感謝します!

Hi @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行目)。これは、お客様の例で示された値と同じです。
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 を、お使いのカテゴリ名に置き換えてください。カテゴリ名は、大文字と小文字を区別することに注意してください。

これで役立つかどうか、お知らせください!

「いいね!」 4

@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

複数のカテゴリIDとカスタム間隔(例:1時間、30分、3か月など)を入力できます。

注意:post_action_type_id 6は、ユーザーが警告を受けたことに関連していると思われるため、そのままにしておきました。カウントに含めるかどうかはわかりません。必要なければ削除してください。

「いいね!」 3

参考情報ですが、6は「ユーザーに通知する」であり、フラグメニューから開始されたユーザー間PM用です: :+1:

ただし、モデレーターが公式な警告としてマークすることも可能です。

「いいね!」 3

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