J’ai une requête SQL pour des badges qui décerne un badge en fonction du nombre de nouveaux sujets créés dans une catégorie spécifique, qui contient également une phrase spécifique (une URL spécifique) dans le premier message du sujet.
Cela fonctionne, mais pas tout à fait comme prévu :
SELECT badge_posts.user_id, min(badge_posts.created_at) granted_at, MIN(badge_posts.id) AS post_id
FROM badge_posts
JOIN topics ON topics.id = badge_posts.topic_id
WHERE category_id = 17
AND badge_posts.post_number = 1
AND badge_posts.raw LIKE '%dronescene.co.uk%'
GROUP BY badge_posts.user_id
HAVING COUNT(*) > 49
ORDER BY post_id DESC
J’ai quatre badges disponibles, bronze, argent, or, platine et j’utilise des choses comme HAVING count(*) > 1 pour le bronze et HAVING count(*) > 10 pour l’argent, etc. Les badges sont tous décernés automatiquement, pas de problème de ce côté-là.
Le problème que je semble avoir, c’est que tous les badges sont décernés pour le premier ID de sujet dans cette catégorie, au lieu du dernier ID de sujet.
Par exemple, j’ai un membre avec trois badges et les trois badges ont été décernés contre le premier sujet qu’ils ont créé et qui correspond à ma clause WHERE, au lieu du tout dernier ID de sujet qui correspond à la clause WHERE.
Quelqu’un peut-il me dire ce que je fais de mal avec mes ORDER BY ?
Si j’échange MIN avec MAX, j’obtiens alors l’ID du sujet le plus récent (merci @JammyDodger ), mais maintenant, après avoir examiné certains changements de prévisualisation, je pense que ma logique est fondamentalement erronée de toute façon
Utiliser MAX fait que tous les autres badges de ce groupe sont également attribués pour l’ID du sujet le plus récent.
C’est le même problème, juste inversé.
D’oh
Ma logique était simplement :
Le problème étant que si quelqu’un gagne le bronze en janvier, l’argent en mars et l’or en juin, les trois badges sont attribués pour leur premier ID de sujet en janvier
Je pense que c’est parce que vous l’exécutez sur des personnes qui sont déjà éligibles pour les quatre. Si elle était introduite ‘fraîchement’, je pense qu’elle accorderait automatiquement à la date du dernier sujet dès qu’un utilisateur franchirait un seuil.
Pour une exécution ‘héritée’, vous pourriez avoir besoin d’ajouter une LIMIT ?
Edit : Retourner les 25 premiers enregistrements éligibles (par exemple) par utilisateur en une seule requête dépasse mes compétences actuelles.
Cependant, selon le nombre d’utilisateurs éligibles à plusieurs badges, vous pourriez attribuer manuellement les badges hérités à l’aide des informations d’une requête data-explorer ? Et ensuite, l’exécution de la requête d’auto-badge ci-dessus devrait accorder le bon badge pour le bon message après leur attribution.
Quelque chose comme :
-- [params]
-- int :user_id = 1
-- int :limit = 50
SELECT bp.user_id, bp.created_at, bp.id as post_id
FROM badge_posts bp
JOIN topics t ON t.id = bp.topic_id
WHERE bp.user_id = :user_id
AND t.category_id = 17
AND bp.post_number = 1
AND bp.raw LIKE '%dronescene.co.uk%'
ORDER BY bp.created_at ASC
LIMIT :limit
Je m’excuse pour les éventuelles fautes de frappe.
(Le Bronze devrait être réalisable avec la version MIN, et le Platine avec la version MAX, donc ce sont juste les 10 et 25)