Badges pour le nombre de sujets épinglés / Badge SQL ?

Notre communauté est centrée sur les sujets épinglés et les sujets épinglés globalement. Malheureusement, il n’existe aucun comptage de statistiques à ce sujet sur les pages de profil des utilisateurs, et il semble que les épingles/épingles globales ne soient stockées de manière systématique nulle part dans la base de données.

Compte tenu de cela, je cherche un moyen d’accorder au moins des badges tels que « Premier épinglé », « 10 épinglés », « 100 épinglés », ainsi que pour les sujets épinglés globalement.

Pourriez-vous, s’il vous plaît, m’aider avec le SQL des badges pour ce type de badges ?

Mon point de départ :

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 t.unpinned IS NOT NULL
GROUP BY p.user_id
HAVING count(*) > 5

Mais cela me donne l’erreur :

ERROR: column t.unpinned does not exist
LINE 6: WHERE t.unpinned IS NOT NULL

Je suppose que je dois utiliser unpinned, car il n’y a pas d’autre point de données qui reste associé aux sujets ayant été épinglés, à ma connaissance. Ou pourrais-je potentiellement utiliser post_actions ici ?

Ou peut-être rechercher le premier message d’un sujet par un utilisateur du personnel/du système contenant « épinglé il y a … » pour compter ? action_code => pinned.disabled

Mise à jour : Cela semble fonctionner d’une manière ou d’une autre…

SELECT t.user_id, current_timestamp granted_at
FROM badge_posts p
INNER JOIN topics t on t.id = p.topic_id
WHERE p.action_code ilike 'pinned.disabled'
GROUP BY t.user_id
HAVING count(*) > 0

Mais je ne suis pas sûr que ce soit la meilleure approche, et comme un message peut être épinglé et désépinglé plusieurs fois… je ne suis pas sûr que cette requête ne capture qu’UN seul pinned.disabled par topic.id.

Une aide d’un wizard SQL des badges serait appréciée.

Ou également la possibilité de stocker systématiquement les épingles dans la base de données, comme les « likes », etc., à l’avenir, et de les afficher dans la section Statistiques du profil de l’utilisateur, avec des liens « ÉPINGLÉ ». Parce que si un sujet est épinglé, c’est une appréciation bien plus grande par rapport aux likes et devrait être prise en compte.

Mise à jour :

J’ai résolu cela moi-même maintenant. Voici la requête finale pour le badge :

WITH unpinned AS ( /* Obtenir les sujets éligibles ayant au moins un pinned.disabled */
	SELECT t.user_id, t.id
	FROM badge_posts p
	INNER JOIN topics t ON t.id = p.topic_id
	WHERE p.action_code ILIKE 'pinned.disabled'
	GROUP BY t.id, t.user_id
	HAVING COUNT(*) > 0
)
SELECT user_id, COUNT(*), CURRENT_TIMESTAMP AS granted_at 
FROM unpinned
GROUP BY user_id
HAVING COUNT(*) > 0

Le dernier COUNT doit être modifié pour refléter le nombre de sujets qui ont été épinglés à un moment donné, par exemple > 0 signifie au moins un sujet épinglé, > 10 signifie au moins dix sujets ayant été épinglés.

J’ai dû recourir à cette solution de contournement avec ‘pinned.disabled’, car Discourse ne dispose d’aucune autre donnée sur l’historique des épingles dans la base de données. De plus, il n’est pas possible de distinguer dans cette requête les épingles régulières des épingles globales en raison du manque de données disponibles.

À mon avis, cela devrait être modifié à l’avenir, car les épingles globales > les épingles régulières > les commentaires > les likes > les vues devraient être pris en compte dans les statistiques d’engagement, mais ils ne le sont pas du tout.