在 MySQL 中使用或不使用 ORDER BY 按“排名计数”列对用户进行排序

问题描述 投票:0回答:1

我有一个游戏,它有 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 mysql group-by sql-order-by
1个回答
0
投票

为此,您可以使用动态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,因为在样本数据中找不到。

© www.soinside.com 2019 - 2024. All rights reserved.