ユーザーのリスト(上位10名程度)を、保有しているバッジの総数でソートして表示するSQLを作成した方はいらっしゃいますか?
Data Explorerで少し調べて、「user_badges」テーブルを確認しましたが、「user_id」カラムと「badge_id」カラムがあることはわかりました。しかし、SQLのスキルが不足しているため、集計や結合クエリを実行して上位10名のリストを作成することができません。
すでに同様のことを実現された方はいますか?
ユーザーのリスト(上位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
@SidV さん、こんにちは ![]()
これは非常にうまく機能しています。ありがとうございます!
ただし、完全には正確ではありません…
私が取得した結果は以下の通りです:
しかし、いくつかのユーザーの上にカーソルを合わせると、異なる数値が表示されます。
Memento は 44(48 ではない):
Brian は 33(35 ではない):
一方、Paul は実際に 34 です!
管理者を除外する行を削除すると、少しおかしくなります:
Ping は 52(179 ではない):
しかし、Ozone は確かに 47 です:
@SidV さん、これらの不正確さの原因について何か心当たりはありますか?
今回もご支援いただき、改めてありがとうございます ![]()
はい。多くのバッジは、複数回獲得できるオプションがあります。![]()
より正確かどうかを確認してみてください:
-- [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