我有一个游戏,它有 10 个世界,每个世界有 20 个级别。
并有一个像这样的
ranks
表:
id | 用户ID | world_num | level_num | 排名 |
---|---|---|---|---|
# | 用户ID1 | 1 | 1 | 3 |
# | 用户ID1 | 1 | 2 | 1 |
# | 用户ID1 | 5 | 15 | 12 |
# | 用户ID1 | 2 | 5 | 2 |
# | 用户ID2 | 1 | 1 | 1 |
# | 用户ID2 | 1 | 2 | 2 |
# | 用户ID2 | 5 | 15 | 4 |
# | 用户ID2 | 2 | 5 | 1 |
... |
所以
user_id,world_num,level_num
组是uniq的(每个用户只有一个“world_num = 1,level_num = 1”行和排名)
我有一个
rank
列,它显示了world_num,level_num
组的排名。 (对于每个级别,我都用代码对列表进行了排名。)
我想显示一个“总体排名列表屏幕”,它将显示全球排名靠前的用户。
我想写一个sql代码:
拥有最多
"rank 1"
的用户应该位于列表顶部,
如果两个用户具有相同的 "rank 1" count
,那么拥有最多 "rank 2"
的用户应该是第二个
等等...
我写了这样的sql代码:
SELECT `user_id`, `rank`, COUNT(`rank`) AS 'rank_count'
FROM score
GROUP BY `rank`
当我运行这个时,我有
ranks
和 rank counts
但我无法像这样订购:
ORDER BY 'rank_count_1', 'rank_count_2', 'rank_count_3', 'rank_count_4' ....
我想展示的表格是这样的:
1. userId92 (rank1Count = 60)
2. userId45 (rank1Count = 57, rank2Count = 46, rank5Count = 8)
3. userId12 (rank1Count = 57, rank2Count = 40, rank3Count = 17)
4. userId76 (rank1Count = 55, rank3Count = 20, rank4Count = 80)
5. userId33 (rank1Count = 55, rank4Count = 25, rank5Count = 35)
...
如何写“总排行榜”的sql?
列
user_id
这正是我想要的:https://dbfiddle.uk/-YLilhd4
为此,您可以使用动态sql来实现。这是示例代码
SET @sql = CONCAT('
SELECT user_id, ', (
SELECT GROUP_CONCAT(
CONCAT(
'MAX(CASE WHEN user_rank = ', user_rank,
' THEN rankCount ELSE 0 END) AS rank', user_rank, 'Count'
)
ORDER BY user_rank
)
FROM (
SELECT DISTINCT user_rank FROM score
) AS subquery
), '
FROM (
SELECT user_id, user_rank, COUNT(*) AS rankCount
FROM score
GROUP BY user_id, user_rank
) AS counts
GROUP BY user_id
ORDER BY ', (
SELECT GROUP_CONCAT(CONCAT('rank', user_rank, 'Count DESC') ORDER BY user_rank)
FROM (
SELECT DISTINCT user_rank FROM score
) AS subquery
)
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
这里是用于测试它的示例 dbfiddle。但是,它可能只是根据可用排名进行排名。正如您所看到的,它将排名 1,2,3,4,12,并且没有排名 5,6,...,11,因为在样本数据中找不到。