首页 >数据库 >mysql教程 >MySQL中如何根据多列对用户进行排名?

MySQL中如何根据多列对用户进行排名?

DDD
DDD原创
2024-12-29 09:45:10265浏览

How to Rank Users Based on Multiple Columns in MySQL?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn