여러분 안녕하세요!
여기서 배지 쿼리를 몇 가지 테스트해 보고 있습니다
일부는 잘 작동하지만, 나머지는 아직 시도 중입니다.
특정 카테고리에 생성된 주제에서 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회 이상인 사용자에게 배지를 부여하고 싶습니다. 이런 방식으로 구현하는 법을 아시는 분 계신가요? 
아마도 이것이 해결책일 수 있습니다 (추가 테스트 예정 :D)
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 (: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회로 높아졌습니다. 그러면 당신은 배지를 잃게 됩니다.
이러한 일이 일어나지 않도록 막을 수 있는 방법이 있을까요?