Badge per numero di argomenti fissati / Badge SQL?

La nostra community è incentrata sui topic fissati (pinned) e globalmente fissati (globally pinned). Purtroppo, non esiste alcun conteggio statistico relativo a questo nelle pagine del profilo utente e sembra che i pin/global pin non siano memorizzati in modo sistematico in alcun punto del database.

Alla luce di ciò, sto cercando un modo per assegnare almeno badge come “Primo topic fissato”, “10 topic fissati”, “100 topic fissati”, nonché per i topic globalmente fissati.

Qualcuno potrebbe gentilmente aiutarmi con il codice SQL per i badge di questo tipo?

Il mio punto di partenza:

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

Ma questo mi restituisce l’errore:

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

Immagino di dover fare affidamento su “unpinned”, dato che non esiste alcun altro dato associato ai topic che siano stati fissati in passato, per quanto ne sappia. Oppure potrei utilizzare “post_actions”?

O forse cercare il primo post in un topic effettuato da un utente staff/sistema che contenga “pinned … ago” per fare il conteggio? action_code => pinned.disabled

Aggiornamento: Sembra che questo funzioni in qualche modo…

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

Ma non sono sicuro che sia l’approccio migliore e, dato che un post può essere fissato e defissato più volte… non sono certo che questa query catturi solo UN “pinned.disabled” per topic.id.

Apprezzerei molto l’aiuto di un mago del SQL per i badge.

O anche la considerazione di memorizzare i pin in modo sistematico nel database, come avviene per i “like”, e di visualizzarli nella sezione Statistiche del profilo utente, con link tipo “È STATO FISSATO”. Perché se un topic viene fissato, è un segno di apprezzamento molto maggiore rispetto ai like e dovrebbe essere preso in considerazione.

Aggiornamento:

Ho risolto il problema da solo. Ecco la query finale per il badge:

WITH unpinned AS ( /* Ottieni i post dei topic idonei con almeno 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 granted_at 
FROM unpinned
GROUP BY user_id
HAVING count(*) > 0

L’ultimo conteggio deve essere modificato per riflettere il numero di topic che sono stati fissati in passato, ad esempio >0 significa almeno un topic fissato, >10 almeno 10 topic che sono stati fissati in passato.

Ho dovuto ricorrere all’alternativa di pinned.disabled poiché Discourse non dispone di altri punti dati relativi alla cronologia dei fissaggi nel database. Inoltre, non è possibile distinguere in questa query tra fissaggi regolari e fissaggi globali a causa della mancanza di dati disponibili.

A mio avviso, questa situazione dovrebbe essere modificata in futuro, poiché i fissaggi globali dovrebbero avere priorità sui fissaggi regolari, che a loro volta dovrebbero avere priorità su commenti, like e visualizzazioni per le statistiche di coinvolgimento, ma al momento non vengono presi in considerazione per nulla.