Wir haben eine Bronzemedaille, Users Helping Users, für Leute erstellt, die versuchen, anderen Benutzern zu helfen. Diese wird manuell vergeben (um zwischen hilfreichen Versuchen und „Ich auch“-Beiträgen unterscheiden zu können).
Für jede 5 Bronzemedaillen möchten wir eine Silbermedaille, Invaluable, vergeben.
Die SQL-Abfrage, die ich erstellt habe, findet die richtigen zwei Benutzer, aber nur jeweils einmal:
SELECT user_id, current_timestamp AS granted_at
FROM user_badges
WHERE badge_id = 110 -- Users Helping Users
AND (:backfill OR user_id IN (:user_ids))
GROUP BY user_id
HAVING COUNT(*) >= 5
Fehlt mir ein Zauber in meiner SQL-Abfrage, oder geschieht die Multiplikation außerhalb der SQL-Abfrage?
Außerdem ist mir nicht klar, wie die Berechnung abläuft, damit meine beiden Benutzer nicht jeden Tag neue Medaillen erhalten (dies wird nächtlich ausgeführt), selbst wenn sie keine 5 neuen Bronzemedaillen erhalten haben.
Gibt es eine Anleitung dazu, die meine Suche nicht gefunden hat?
Eine tiefere Suche führte mich zu einem Leitfaden, der mich zu diesem Leitfaden brachte.
Das mit dem Backfill ist immer noch etwas unklar, aber ich habe beschlossen, dies (natürlich!) auf unserer Testinstanz auszuprobieren. Ich nehme an, das Backfill läuft über Nacht, sodass ich morgen mehr weiß.
Es sei denn, Sie aktivieren „Kann mehrmals vergeben werden“, dann sollte es nicht öfter als einmal vergeben werden, auch wenn sie sich ein zweites (oder weiteres) Mal dafür qualifizieren.
Okay, ich habe Ihren Beitrag gründlicher gelesen und glaube, ich habe eine klarere Vorstellung davon, was Sie erreichen möchten.
Basierend auf der aktuellen SQL-Abfrage werden diese Benutzer das Silber-Abzeichen nur einmal erhalten, auch wenn Sie zulassen, dass es mehrmals vergeben wird:
Ich habe die entsprechenden Abzeichen auf meiner Testseite erstellt (einschließlich der Zulassung mehrerer Vergaben)
5 Bronze-Abzeichen vergeben und den Hintergrundjob ausgeführt, um das Abzeichen zu vergeben (Silber-Abzeichen erfolgreich vergeben )
Ich habe dann den BadgeGrant-Job erneut ausgeführt und das Silber-Abzeichen wurde ihnen nicht ein zweites Mal vergeben
Ich habe dann ihre Bronze-Abzeichen auf 11 erhöht und den Badge-Grant-Job erneut ausgeführt
Das ist eine gute Frage, auf die ich nicht sofort eine Antwort weiß.
Ich denke vorläufig an etwas mit RANK, aber vielleicht greife ich nach Strohhalmen…
Grober Prototyp...
WITH badge_count AS (
SELECT
user_id,
granted_at,
RANK() OVER (PARTITION BY user_id ORDER BY granted_at ASC) AS rank
FROM user_badges
WHERE badge_id = 110
)
SELECT user_id, granted_at
FROM badge_count
WHERE rank IN (5,10,15,20,25,30,35,40,45,50)
Okay, ein zweiter Versuch mit ROW_NUMBER anstelle von:
WITH badge_count AS (
SELECT
user_id,
granted_at,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY granted_at ASC) AS row
FROM user_badges
WHERE badge_id = 110
)
SELECT user_id, granted_at
FROM badge_count
WHERE row % 5 = 0
Bei weiterer Prüfung funktioniert dies in der Vorschau korrekt, wird aber nicht mehrmals gewährt, wenn der eigentliche badge grant-Job ausgeführt wird. Ich bin mir nicht wirklich sicher, warum.
Ich habe mich selbst verwirrt. Ich werde eine Tasse Tee trinken und mich neu sammeln.
Nun… ich habe meinem Benutzer gestern weitere 4 Bronzemedaillen gegeben, um zu sehen, ob der nächtliche Lauf zumindest das neue Abzeichen hinzufügt, das er gerade „verdient“ hatte. (Ich dachte, wenn ich den Rest von Hand aufholen müsste, könnte ich das tun.) Aber selbst das hat nicht funktioniert.
Ich kann Ihnen bei der Abfrage nicht helfen, schlage aber vor, dass Sie den Discourse AI Bot um Hilfe bitten – wählen Sie das Bot-Symbol oben \n -\u003e GPT-4 -\u003e SQL Helper.\n\nIch fand es sehr gut darin, Data Explorer-Abfragen zu erstellen, indem ich ihm einfach sage, was ich brauche, und ich schätze, dass es bei Badge-Abfragen helfen kann.
Nicht jeder hat das, Toni Du machst die Leute eifersüchtig. (obwohl @ganncamp das hat, also ist es eine Option)
Aber… ich bin ziemlich sicher, dass meine Abfrage korrekt ist. Sie wählt die richtigen in der Vorschau aus, vergibt aber nicht mehr als eine, wenn der Trigger ‘Täglich aktualisieren’ verwendet wird.
Ich habe eine weitere, fast identische eingerichtet, um sie zu testen, basierend auf einem Abzeichen für ‘alle 5 Beiträge in einem bestimmten Thema’ unter Verwendung des Triggers ‘Wenn ein Benutzer einen Beitrag erstellt oder bearbeitet’ - und diese funktioniert perfekt. Ich erkunde, was der Unterschied sein könnte…
Hier ist die SQL für dieses Testabzeichen zum Vergleichen, falls jemand etwas entdecken kann:
WITH post_count AS (
SELECT
user_id,
id,
created_at,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at ASC) AS row
FROM posts
WHERE topic_id = 864
)
SELECT user_id, created_at granted_at, id post_id
FROM post_count
WHERE row % 5 = 0
AND (:backfill OR id IN (:post_ids))
Ich habe Zugriff darauf, @tpetrov, aber meine Versuche, ihn zu nutzen, waren… weniger als fruchtbar. Oder vielleicht bin ich einfach gut darin, schwierige Fragen zu stellen?
Nach ein wenig Erkundung und Rücksprache scheint es, dass der automatische Badge-Granter nur mehrere Badges vergibt, wenn diese auf bestimmten Beiträgen basieren. Diese Art von Badges vergibt also nur den ersten Badge (die Vorschau ist irreführend ).
Ich denke, in ähnlichen Fällen können „eskalierende“ Badges gut funktionieren (wie die „Gelösten“). Also zum Beispiel ein Silber für 30 und ein Gold für 100, wenn das eine praktikable Alternative sein könnte?
Also… obwohl die Bronze-Abzeichen auf Beiträgen basieren… zählt das nicht, oder?
Ich weiß nicht. Ich glaube, ich verstehe die Frage nicht.
Ich schätze, der Vorschlag ist nicht, 5 Abzeichen zu finden, sondern 5 Beiträge, für die ein Abzeichen vergeben wurde? Das kann ich tun. Ich habe es in meinem Bericht „Neue Beiträge finden, für die Abzeichen vergeben werden sollen“ mehr oder weniger bereits getan.
Hmmm. :denkend: Ich glaube, ich verstehe, worauf Sie hinauswollen. Lassen Sie mich es noch einmal versuchen…
@ganncamp - Ich glaube, wir haben vielleicht etwas Erfolg… :leicht_lächelnd:
Basierend darauf, dass Bronze Badge A durch den Post-Schraubenschlüssel vergeben wird oder indem ein Grund auf der Seite /admin/users/{user_id}/{username}/badges angegeben wird:
Dann denke ich, dass dies tatsächlich möglich ist. :party:
WITH badge_count AS (
SELECT
user_id,
granted_at,
post_id,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY granted_at DESC) AS row
FROM user_badges
WHERE badge_id = 110
AND post_id IS NOT NULL
)
SELECT user_id, granted_at, post_id
FROM badge_count
WHERE row % 5 = 0
AND (:backfill OR post_id IN (:post_ids))
(Das Hinzufügen von AND post_id IS NOT NULL schützt es, falls jemand einen ohne Grund erhält, sonst bricht es ab)
Ich habe es gerade ausprobiert und die Zeit vorgespult, indem ich den GrantBadge-Hintergrundjob ausgelöst habe, und mein Testbenutzer hat endlich die volle Anerkennung erhalten, die er verdient. :leicht_lächelnd:
Nun… als der Job über Nacht lief, erhielt mein Benutzer mit 6 Bronzen 1 Silber mein Benutzer mit 13 Bronzen erhielt… 1 Silber
Dieser Teil des Tutorials ließ mich denken, dass ein separater, expliziter Backfill-Job nicht notwendig war
Da täglich ein vollständiger Backfill unabhängig davon ausgeführt wird, müssen Sie dies berücksichtigen und die Behandlung des Parameters :backfill einschließen.
Wie erhalte ich für Benutzer, die bereits mehr als 1 Silber gewonnen haben, die Auszeichnungen? Muss ich das manuell machen?
Der Backfill ist der tägliche Job. Der Trigger „Täglich aktualisieren“ ist im Wesentlichen genau das, während die anderen Trigger viel mehr „zur Zeit“ sind (z. B. wenn ein Abzeichen „wenn ein Benutzer einen Beitrag erstellt oder bearbeitet“ verwendet, müsste es nicht über Nacht warten, um es verliehen zu bekommen).
Können Sie einen Screenshot Ihres Abzeichens einfügen, damit ich sehen kann, was möglicherweise anders ist?
Ich hatte angenommen, der Job würde in den frühen Morgenstunden (meines) Morgens laufen.
Tatsächlich hatte ich diesem Benutzer ursprünglich ohne Gründe Abzeichen verliehen, also habe ich gestern alle widerrufen, Beiträge von ihm ausgegraben und neu verliehen. Der Job lief mitten in meiner Verleihung.
Das ist übrigens auf meiner Staging-Seite.
Ich nehme an, das zweite Abzeichen wird in ein paar Stunden verliehen, aber ich möchte sehen, wie mehrere Abzeichen auf einmal verliehen werden. Wird das passieren, wenn ich das Silber widerrufe? Wird ihm in… 2 Stunden 2 neue Silber verliehen?