在 MySQL 中根据多列确定排名
在 MySQL 中处理数据时,通常需要根据根据具体标准。在本例中,任务涉及根据用户 ID 和游戏 ID 对用户进行排名,排名按照游戏详细信息的降序排列。
为了解决这个问题,我们将使用子查询对数据进行排序,例如具有相同用户 ID 的所有行都分组在一起,并根据游戏详细信息按降序在它们之间进一步排序。然后,我们将使用条件 CASE..WHEN 表达式来计算行编号并分配用户游戏排名。
以下 SQL 查询提供了解决方案:
SET @r := 0, @u := 0; SELECT @r := CASE WHEN @u = dt.user_id THEN @r + 1 WHEN @u := dt.user_id /* Notice := instead of = */ THEN 1 END AS user_game_rank, dt.user_id, dt.game_detail, dt.game_id FROM ( SELECT user_id, game_id, game_detail FROM game_logs ORDER BY user_id, game_detail DESC ) AS dt
在查询中,我们使用用户定义的变量@r和@u来跟踪行排名和用户ID。我们确保对 user_game_rank 的评估和分配给 @u 的用户 ID 发生在同一表达式中,以保持其正确的顺序。
此查询的结果将提供所需的用户游戏排名:
| user_game_rank | user_id | game_detail | game_id | | -------------- | ------- | ----------- | ------- | | 1 | 6 | 260 | 11 | | 2 | 6 | 100 | 10 | | 1 | 7 | 1200 | 10 | | 2 | 7 | 500 | 11 | | 3 | 7 | 260 | 12 | | 4 | 7 | 50 | 13 |
对于 MySQL 8.0 及以上版本,更高效的做法是使用 Row_Number() 函数,该函数可以直接根据指定的行排名计算criteria:
SELECT user_id, game_id, game_detail, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY game_detail DESC) AS user_game_rank FROM game_logs ORDER BY user_id, user_game_rank;
此查询将提供与前一个查询相同的输出,但它提供了改进的性能,并且是 MySQL 8.0 中行排名的推荐方法。
以上是MySQL中如何根据多列对用户进行排名?的详细内容。更多信息请关注PHP中文网其他相关文章!