投票に関連する良いバッジを探しています

バッジのアイデアがいくつかありますが、クエリの書き方がわからず困っています(テーブル構造を十分に理解していないためです)。数値はあくまで基準として使用します。追加のバッジのためにこれらを拡張する予定です。

  1. 自分が投稿したトピックで10票を得た人
  2. 自分が投稿したすべてのトピックで合計20票を得た人
  3. 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