ich habe eine Badge-SQL-Abfrage, die eine Badge basierend auf der Anzahl der erstellten neuen Themen in einer bestimmten Kategorie vergibt, die auch einen bestimmten Satz (eine bestimmte URL) im ersten Beitrag des Themas enthält.
Sie funktioniert, aber nicht ganz wie beabsichtigt:
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
Ich habe vier verfügbare Badges: Bronze, Silber, Gold und Platin, und ich verwende Dinge wie HAVING count(*) > 1 für Bronze und HAVING count(*) > 10 für Silber usw. Die Badges werden alle automatisch vergeben, keine Probleme damit.
Das Problem, das ich zu haben scheine, ist, dass alle Badges für die erste Themen-ID in dieser Kategorie vergeben werden, anstatt für die letzte Themen-ID.
Zum Beispiel habe ich ein Mitglied mit drei Badges, und alle drei Badges wurden gegen das erste Thema vergeben, das es erstellt hat und das meine WHERE-Klausel erfüllt, anstatt für die allerneueste Themen-ID, die die WHERE-Klausel erfüllt.
Kann mir jemand sagen, was ich mit meinen ORDER BY falsch mache?
Wenn ich MIN mit MAX tausche, erhalte ich die neueste Topic-ID (danke @JammyDodger ), aber nachdem ich mir einige Vorschläge für Änderungen angesehen habe, glaube ich, dass meine Logik hier sowieso grundlegend fehlerhaft ist
Die Verwendung von MAX führt dazu, dass alle anderen Badges in dieser Gruppe für die neueste Topic-ID vergeben werden.
Es ist dasselbe Problem, nur umgekehrt.
D’oh
Meine Logik war einfach:
Das Problem dabei ist, wenn jemand im Januar das Bronze-Badge, im März das Silber-Badge und im Juni das Gold-Badge verdient, werden alle drei Badges für ihre erste Topic-ID im Januar vergeben
Ich glaube, das liegt daran, dass Sie es auf Personen anwenden, die bereits für alle vier qualifiziert sind. Wenn es „frisch“ eingeführt würde, würde es meiner Meinung nach automatisch zum spätesten Datum des Themas vergeben, sobald ein Benutzer einen Schwellenwert erreicht hat.
Für einen „Legacy“-Lauf müssen Sie möglicherweise ein LIMIT hinzufügen?
Bearbeiten: Die ersten (z. B.) 25 berechtigten Datensätze pro Benutzer in einer Abfrage zurückzugeben, übersteigt meine derzeitigen Fähigkeiten.
Je nachdem, wie viele Benutzer sich für mehrere Abzeichen qualifizieren, könnten Sie die Legacy-Abzeichen jedoch manuell mit Informationen aus einer Daten-Explorer-Abfrage vergeben? Und dann sollte die obige Auto-Badge-Abfrage das richtige Abzeichen für den richtigen Beitrag vergeben, nachdem diese vergeben wurden.
So etwas wie:
-- [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
Ich entschuldige mich für Tippfehler.
(Das Bronze sollte mit der MIN-Version machbar sein, und das Platin mit dem MAX, also sind es nur die 10 und 25.)