아래 코드는 Tier 2에 대한 것입니다. 다른 티어들은 숫자 '100’을 제외하고는 차이가 없습니다.
SELECT us.user_id, current_timestamp AS granted_at
FROM user_stats AS us
WHERE us.likes_received >= 100
AND us.likes_given >= 100
AND (:backfill OR us.user_id IN (:user_ids))
이 경우에도 균형을 맞추기 위해 배지 SQL에 한 줄을 더 추가해야 할까요? 다음과 같은 형태로요:
SELECT us.user_id, current_timestamp AS granted_at
FROM user_stats AS us
WHERE us.likes_received >= 100
AND us.likes_given >= 100
AND us.likes_given < 250
AND (:backfill OR us.user_id IN (:user_ids))
(아직 테스트해 보지는 않았지만, BETWEEN 또는 유사한 구문을 사용할 수도 있을 것 같습니다 )
그리고 쿼리가 실행되면 100 Likes를 처음 달성했을 때 배지를 부여하고, 101부터 249까지는 무시한 채 250에서 회수하게 됩니다(다음 배지가 이 지점부터 이어지도록요).
업데이트:BETWEEN으로 조금 연습해 본 결과, 다음과 같은 쿼리가 샘플 테스트에서 올바른 대상자들을 모두 잡아내는 것 같습니다:
SELECT us.user_id
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249
ORDER BY us.likes_received DESC
따라서 다음과 같은 쿼리를 트리거형 배지로 변환하면 작동할 것입니다:
SELECT us.user_id, current_timestamp AS granted_at
FROM user_stats AS us
WHERE us.likes_received BETWEEN 100 AND 249
AND us.likes_given BETWEEN 100 AND 249
AND (:backfill OR us.user_id IN (:user_ids))
거의 완벽합니다. 드물게 발생할 수 있는 한 가지 경우가 있습니다: ‘given’ 항목에서 과잉 제공을 하는 반면 ‘received’ 항목에서 뒤처지는 경우(또는 그 반대)로, 다음 배지가 부여되기 전에 현재 배지가 취소될 수 있습니다(취소 루틴).
주변을 둘러보다가 흥미로운 특성을 발견했습니다: something.badge_id = 123에서 'something’은 사용자 정의 변수이고, '123’은 다른 배지의 ID입니다. 한 번 시도해 보고, Tier 1과 Tier 2의 기존 SQL 쿼리에 상위 티어 배지에 대한 자격 상실 확인 로직을 추가해 보겠습니다.