Serveuto un aiuto con un po' di Badge SQL

Ciao a tutti,

Ho un po’ di SQL per badge che rilascia un badge a seconda del numero di argomenti nuovi creati in una categoria specifica che contiene anche una frase specifica (un URL specifico) nel primo post dell’argomento.

Funziona, ma non proprio come previsto:

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

Ho quattro badge disponibili, bronzo, argento, oro, platino e uso cose come HAVING count(*) > 1 per il bronzo e HAVING count(*) > 10 per l’argento, ecc. I badge vengono tutti rilasciati automaticamente, nessun problema.

Il problema che sembro avere è che tutti i badge vengono rilasciati per il primo ID argomento in quella categoria, invece che per l’ultimo ID argomento che corrisponde alla mia clausola WHERE.

Ad esempio, ho un membro con tre badge e tutti e tre i badge sono stati rilasciati contro il primo argomento che ha creato e che corrisponde alla mia clausola WHERE, invece che per l’ultimo ID argomento che corrisponde alla clausola WHERE.

Qualcuno può dirmi cosa sto sbagliando con i miei ORDER BY? :thinking:

1 Mi Piace

Sono ancora abbastanza nuovo a SQL, ma è MIN? Non restituirà il primo invece dell’ultimo?

2 Mi Piace

La mia ipotesi è di fare SORT DESC per gli argomenti e poi forse otterrai l’ultimo.

2 Mi Piace

Se scambiassi MIN con MAX otterrei l’ID dell’argomento più recente (grazie @JammyDodger), ma ora, avendo esaminato alcune modifiche di anteprima, penso che la mia logica sia comunque fondamentalmente errata :grimacing:

Usando MAX, tutti gli altri badge in questo gruppo vengono assegnati per l’ID dell’argomento più recente invece.
È lo stesso problema, solo al contrario.
D’oh :man_facepalming:

La mia logica era semplicemente:

Il problema è che se qualcuno guadagna il Bronzo a gennaio, l’Argento a marzo e l’Oro a giugno, tutti e tre i badge vengono assegnati per il loro primo ID argomento a gennaio :thinking:

Qualcuno ha qualche idea? :man_shrugging:

2 Mi Piace

Penso che sia perché lo stai eseguendo su persone che si qualificano già per tutti e quattro. Se fosse stato introdotto “fresco”, penso che avrebbe automaticamente concesso alla data dell’ultimo argomento non appena un utente avesse superato una soglia.

Per un’esecuzione “legacy”, potrebbe essere necessario aggiungere un LIMIT?

Modifica: Restituire i primi (ad esempio) 25 record idonei per utente in una query è al di là delle mie attuali capacità. :slightly_smiling_face:

Tuttavia, a seconda di quanti utenti si qualificano per badge multipli, potresti assegnare manualmente quelli legacy utilizzando le informazioni da una query di data-explorer? E quindi l’esecuzione della query di badge automatici sopra dovrebbe concedere il badge giusto per il post giusto dopo che questi sono stati assegnati.

Qualcosa come:

-- [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

Mi scuso per eventuali errori di battitura. :slightly_smiling_face:

(Il Bronzo dovrebbe essere fattibile con la versione MIN, e il Platino con la versione MAX, quindi si tratta solo di quelli 10 e 25)

2 Mi Piace