Vues totales sur plusieurs sujets

Salut les amis !

Je teste quelques requêtes de badges ici :slight_smile: Certaines fonctionnent bien, d’autres sont encore en cours de test.

Quelqu’un sait comment créer une requête qui accorderait un badge à un utilisateur ayant X vues dans des sujets créés dans une catégorie spécifique ? J’ai réussi à construire cette requête, mais pour un seul sujet (L’utilisateur a obtenu au moins X vues dans un sujet d’une catégorie spécifique). Le code est le suivant :

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

Mais au lieu de se limiter à un seul sujet, je voudrais accorder le badge à ceux qui obtiennent, par exemple, 500 vues au total des vues de tous les sujets que cette personne a créés dans la catégorie Y. Quelqu’un sait comment y parvenir ? :smiley:

Peut-être que c’est une solution (d’autres tests arrivent :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

Bonjour à tous, j’ai réussi à tester cette requête ci-dessus et cela a fonctionné ! Maintenant, je me demandais si quelqu’un pouvait m’aider avec un autre défi. Voici la requête :

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

Dans cet exemple : l’utilisateur qui crée des histoires dans la catégorie Arts et dont ces histoires atteignent 100 vues recevra le badge. Le problème est le suivant :
Je devrai modifier cette logique au fil du temps, car le nombre de vues augmentera.
Ce badge nécessite 100 vues aujourd’hui, mais pourrait nécessiter 1000 vues dans 6 mois.

Le problème est que lorsque je modifie la requête, elle s’exécute à nouveau chaque jour et les utilisateurs qui l’ont déjà reçue la perdraient.

Et ce serait un désastre. Imaginez que vous ayez atteint (maintenant, au début de la plateforme) 10 vues et obtenu un badge de niveau 2 en Technologie. Mais quelques mois plus tard, la plateforme se développe et le niveau 2 ne nécessite plus 10 vues, mais 100. Vous perdriez le badge.

Existe-t-il un moyen d’empêcher cela ?