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

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

Susan Sarandon
发布: 2024-12-30 08:14:09
原创
414 人浏览过

How to Rank Rows in MySQL Based on Multiple Columns?

根据 MySQL 中的多个列确定排名

查询:

根据行排名在多个列(user_id 和 game_id)上,同时考虑降序排列game_detail_sum,可以使用子查询和条件 CASE 表达式:

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 
登录后复制

解释:

  1. 子查询按 game_detail_sum 的降序对每个行进行排序user_id.
  2. 外部查询使用用户定义的变量@r (行排名)和@u(前一个 user_id)来分配行号。

使用 MySQL 8 Row_Number() 函数改进查询:

MySQL 8.0 引入Row_Number() 函数,允许更高效的行编号:

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;
登录后复制

附加说明:

  • 在原始方法中,在同一查询中使用 ORDER BY 和用户变量可能无法保证正确的结果,因为优化器不可预测的评估顺序。
  • 使用 Row_Number() 改进的查询性能更高,并提供可预测的结果为 MySQL 8 。

以上是如何根据多列对 MySQL 中的行进行排名?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板