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?
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
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
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
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à.
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.
(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)