多个主题的总浏览量

大家好!

我正在尝试一些徽章查询 :slight_smile: 有些运行正常,有些我还在测试。

有人知道如何创建一个查询,为在特定类别中创建主题且累计获得 X 次浏览的用户授予徽章吗?我已经构建了这个查询,但它是针对单个主题的(用户在特定类别的某个主题中至少获得了 X 次浏览)。代码如下:

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

但我希望不是只针对一个主题,而是为那些在类别 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

在这个示例中:在“艺术”类别创建故事且这些故事浏览量达到 100 的用户将获得徽章。问题在于:
我需要随时间推移调整此逻辑,因为浏览量要求会增加。
该徽章目前需要 100 次浏览,但六个月后可能需要 1000 次浏览。

问题在于,当我修改查询时,它会每天重新运行,导致已经获得徽章的用户失去该徽章。

这将是一场灾难。试想一下,你在平台初期仅获得 10 次浏览就赢得了“科技”类别的 2 级徽章。但几个月后平台壮大,2 级徽章的要求从 10 次浏览提高到 100 次浏览,你就会失去该徽章。

有什么方法可以防止这种情况发生吗?