Alla ricerca di buoni badge relativi al voto

Ho alcune idee per i badge, ma non sono sicuro su come scrivere le query (non conosco abbastanza bene la struttura delle tabelle). I numeri sono solo un punto di partenza; li estenderò per creare altri badge.

  1. Qualcuno ha ricevuto 10 voti su un singolo argomento creato da lui/lei
  2. Qualcuno ha ricevuto 20 voti in totale su tutti gli argomenti creati da lui/lei
  3. Qualcuno ha votato 20 volte

Qualcuno ha già badge simili e vuole condividerli? Altrimenti, c’è qualcuno che vuole provare a scrivere le query?

The second query in this topic might do the trick: Badge ideas for Topic Voting. The query grants the badge to users who have cast a single vote, but there is a suggestion at the bottom of the query for how to require more votes to grant the badge.

2 Mi Piace

Thanks @simon. I actually read over that post already but the query didn’t return the results I was expecting. It was the Limit 1 at the end messing me up. After removing that it works perfect for the “Someone voted x times”.

Any idea how to see how many votes a person got on a topic they wrote? Or how many likes they got total?

Potresti trovare alcune query di Data Explorer che puoi modificare per creare query per i badge. Dai un’occhiata alle query di Data Explorer per i voti sugli argomenti e ad altri argomenti con sql-query e sql-triggered-badge.

1 Mi Piace

Aren’t these rather similar to badges that already exist in Discourse?

That got me quite a ways towards my target:

select    
    t.user_id,
    ucf.value,
    count(*)
from
    topics t
    join user_custom_fields ucf on t.id = cast(ucf.value as int)
where ucf.name = 'votes'
group by ucf.value, t.user_id
order by t.user_id, count(*) desc

That returns:

The two things I’m trying to get are total votes someone got and the topic that has the most votes for each person. You can see mmontecalvo has 2 topics showing. I’m fairly certain I need to use row_number() to get just the highest post but I don’t know how.

@codinghorror These may be similar to a default badge but none of the defaults are built off topics getting votes.

I think I got it! This will give the topic with the most votes per person that has at least 5 votes on it:

WITH query as (
select    
    t.user_id,
    ucf.value,
    count(*) as num,
    t.created_at,
    row_number() OVER (PARTITION BY t.user_id order by count(*) desc) as rank
from
    topics t
    join user_custom_fields ucf on t.id = cast(ucf.value as int)
where ucf.name = 'votes'
group by ucf.value, t.user_id, t.created_at
having count(*) >= 5
order by t.user_id)
select user_id, value as topic_id, created_at granted_at 
from query where rank = 1

I ended up going with this instead so we could give a badge for each topic someone puts in that gets at least X votes in the correct category:

WITH query as (
select    
    t.user_id,
    ucf.value,
    count(*) as num,
    t.created_at
from
    topics t
    join user_custom_fields ucf on t.id = cast(ucf.value as int)
where ucf.name = 'votes' and category_id = (
  SELECT id FROM categories WHERE name ilike 'UI Experience Requests'
)
group by ucf.value, t.user_id, t.created_at
having count(*) >= 5
order by t.user_id)
select user_id, value as topic_id, created_at granted_at 
from query
2 Mi Piace