Preciso de ajuda com um pouco de SQL de Badge, por favor

Olá a todos,

Tenho um SQL de distintivo que emite um distintivo dependendo do número de tópicos novos criados em uma categoria específica que também contém uma frase específica (uma URL específica) na primeira postagem do tópico.

Funciona, mas não exatamente como pretendido:

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

Tenho quatro distintivos disponíveis, bronze, prata, ouro, platina e uso coisas como HAVING count(*) > 1 para o bronze e HAVING count(*) > 10 para o prata, etc. Todos os distintivos são emitidos automaticamente, sem problemas.

O problema que parece estar tendo é que todos os distintivos são emitidos para o primeiro ID de tópico naquela categoria, em vez do último ID de tópico.

Por exemplo, tenho um membro com três distintivos e todos os três distintivos foram emitidos contra o primeiro tópico que ele criou que corresponde à minha cláusula WHERE, em vez do último ID de tópico que corresponde à cláusula WHERE.

Alguém pode me dizer o que estou fazendo de errado com meus ORDER BY? :thinking:

1 curtida

Ainda sou bem novo em SQL, mas é o MIN? Isso não retornará o primeiro em vez do último?

2 curtidas

Minha suposição é usar SORT DESC nos tópicos e então talvez você obtenha o último.

2 curtidas

Se eu trocar MIN por MAX então obtenho o ID do tópico mais recente (obrigado @JammyDodger), mas agora, tendo olhado algumas alterações de pré-visualização, acho que minha lógica aqui está fundamentalmente falha de qualquer maneira :grimacing:

Usar MAX então vê todos os outros distintivos neste grupo serem concedidos para o ID do tópico mais recente em vez disso.

É o mesmo problema, apenas ao contrário.

D’oh :man_facepalming:

Minha lógica era simplesmente:

O problema, portanto, sendo que se alguém ganha o Bronze em janeiro, a Prata em março e o Ouro em junho, todos os três distintivos são concedidos para o primeiro ID de tópico deles em janeiro :thinking:

Alguém tem alguma ideia? :man_shrugging:

2 curtidas

Eu acho que é porque você está executando contra pessoas que já se qualificam para os quatro. Se fosse introduzido ‘do zero’, acho que concederia automaticamente na data do último tópico assim que um usuário atingisse um limite.

Para uma execução ‘legada’, você pode precisar adicionar um LIMIT?

Edição: Retornar os primeiros (por exemplo) 25 registros elegíveis por usuário em uma consulta está além das minhas habilidades atuais. :slightly_smiling_face:

No entanto, dependendo de quantos usuários se qualificam para vários emblemas, você poderia conceder os legados manualmente usando informações de uma consulta do data-explorer? E então executar a consulta de emblema automático acima deve conceder o emblema certo para a postagem certa depois que eles forem concedidos.

Algo como:

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

Peço desculpas por quaisquer erros de digitação. :slightly_smiling_face:

(O Bronze deve ser factível com a versão MIN, e o Platina com a MAX, então são apenas os de 10 e 25)

2 curtidas