バッジ獲得数で「トップX」ユーザーを探す

ユーザーのリスト(上位10名程度)を、保有しているバッジの総数でソートして表示するSQLを作成した方はいらっしゃいますか?

Data Explorerで少し調べて、「user_badges」テーブルを確認しましたが、「user_id」カラムと「badge_id」カラムがあることはわかりました。しかし、SQLのスキルが不足しているため、集計や結合クエリを実行して上位10名のリストを作成することができません。

すでに同様のことを実現された方はいますか?

バッジ数でソートされたユーザー

以下をテストしてください:

-- [params]
-- int :posts = 100
-- int :top = 10
SELECT u.username, count(ub.id) as "Badges"
FROM user_badges ub, users u, user_stats us
WHERE u.id = ub.user_id
AND u.id = us.user_id
AND us.post_count > :posts
AND (u.admin = 'f' AND u.moderator = 'f')
GROUP BY u.username
ORDER BY count(ub.id) desc
LIMIT :top
「いいね!」 6

@SidV さん、こんにちは :wave:t2:

これは非常にうまく機能しています。ありがとうございます!

ただし、完全には正確ではありません…

私が取得した結果は以下の通りです:

しかし、いくつかのユーザーの上にカーソルを合わせると、異なる数値が表示されます。

Memento は 44(48 ではない):

Brian は 33(35 ではない):

一方、Paul は実際に 34 です!

管理者を除外する行を削除すると、少しおかしくなります:

Ping は 52(179 ではない):

しかし、Ozone は確かに 47 です:

@SidV さん、これらの不正確さの原因について何か心当たりはありますか?

今回もご支援いただき、改めてありがとうございます :smiley:

はい。多くのバッジは、複数回獲得できるオプションがあります。:thinking:

より正確かどうかを確認してみてください:

-- [params]
-- int :posts = 100
-- int :top = 10
SELECT u.username, count(ub.id) as "Badges"
FROM user_badges ub, users u, user_stats us, badges b
WHERE u.id = ub.user_id
AND u.id = us.user_id
AND b.id = ub.badge_id
AND us.post_count > :posts
AND (u.admin = 'f' AND u.moderator = 'f')
AND b.multiple_grant = 'f'
GROUP BY u.username
ORDER BY count(ub.id) desc
LIMIT :top
「いいね!」 4

ああ、しまった! :man_facepalming:t2:

はい、もちろんです :blush:

ただし、あなたの更新された返信は、まさに私が求めているものです :clap:t2:

@SidV さん、本当にありがとうございます :bowing_man:

「いいね!」 1

お手伝いできて嬉しいです!

クエリリストを更新しました :rocket:

素敵なクリスマスをお過ごしください!:christmas_tree:

「いいね!」 8