複数のトピックにわたる総ビュー数

みなさん、こんにちは!

ここでバッジクエリを試しています :slight_smile: いくつかはうまくいっていますが、他のものはまだ試行錯誤中です。

特定のカテゴリで作成されたトピックにおいて、X 回以上表示されたユーザーにバッジを付与するクエリを作成する方法をご存知でしょうか?私は以下のクエリを作成できましたが、これは「特定のカテゴリ内のトピックで X 回以上表示されたユーザー」を対象としたものです(トピック 1 つあたり)。コードは以下の通りです:

SELECT p.user_id, min(p.created_at) granted_at, MIN(p.id) post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE category_id = (
  SELECT id FROM categories WHERE name ilike 'Technology'
) AND p.post_number = 1
AND views >= 10
and (:backfill OR ( p.id IN (:post_ids) ))
GROUP BY p.user_id

しかし、1 つのトピックだけでなく、例えば「カテゴリ Y でそのユーザーが作成したすべてのトピックの表示回数の合計が 500 回に達した人」にバッジを付与したいと考えています。これを達成する方法をご存知でしょうか? :smiley:

もしかしたらこれが解決策かもしれません(さらにテストを行います :D)

    SELECT p.user_id, min(p.created_at) as granted_at, MIN(p.id) as post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE category_id = (
  SELECT id FROM categories WHERE name ilike 'Technology'
) AND p.post_number = 1
and (:backfill OR ( p.id IN (:post_ids) ))
GROUP BY p.user_id
HAVING SUM (views) > XXXXXXXXXXX

みなさんこんにちは、上記のクエリをテストしてみましたが、問題なく動作しました!さて、別の課題についてお手伝いいただける方はいませんか?これがクエリです:

SELECT p.user_id, min(p.created_at) granted_at, MIN(p.id) post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE category_id = (
  SELECT id FROM categories WHERE name ilike 'Arts'
) AND p.post_number = 1
and (:backfill OR ( p.id IN (:post_ids) ))
GROUP BY p.user_id
HAVING SUM (views) >= 100

この例では、「Arts」カテゴリでストーリーを作成し、そのストーリーが100ビューに達したユーザーにバッジが付与されます。しかし、問題があります:
このロジックは時間の経過とともに変更する必要が出てくるでしょう。なぜなら、必要なビュー数が将来的に増える可能性があるからです。
このバッジは現在100ビューが必要ですが、6ヶ月後には1000ビューが必要になるかもしれません。

ここで問題なのは、クエリを変更すると毎日再実行されてしまい、すでにバッジを取得したユーザーがバッジを失ってしまうことです。

これは大惨事になりかねません。プラットフォーム立ち上げ初期に10ビューで「Technology」カテゴリのレベル2バッジを獲得したと想像してみてください。しかし、数ヶ月後にプラットフォームが成長し、レベル2の要件が10ビューから100ビューに引き上げられた場合、あなたはバッジを失ってしまいます。

これを防ぐ方法はあるでしょうか?