我有几个关于徽章的想法,但我不确定如何编写查询(我对表结构还不够熟悉)。这些数字仅作为基础使用,我将在之后扩展它们以创建更多徽章。
- 某人在其撰写的单个主题中获得了 10 票
- 某人在其撰写的所有主题中总共获得了 20 票
- 某人进行了 20 次投票
是否有人已经拥有类似的徽章并愿意分享?如果没有,是否有人愿意尝试编写这些查询?
我有几个关于徽章的想法,但我不确定如何编写查询(我对表结构还不够熟悉)。这些数字仅作为基础使用,我将在之后扩展它们以创建更多徽章。
是否有人已经拥有类似的徽章并愿意分享?如果没有,是否有人愿意尝试编写这些查询?
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.
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?
您可能可以找到一些可以修改以创建徽章查询的数据探索器查询。请查看 主题投票的数据探索器查询 以及其他 sql-query 和 sql-triggered-badge 主题。
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