繁体   English   中英

带组的 SQL 等级函数

[英]SQL Rank Function with Group

我想对一组用户的总统计数据进行排名,并为他们分配一个排名变量。 将此线程用于 Rank 变量。

这是我的查询 atm:

SELECT @rank := @rank + 1 AS rank
     , SUM(stats.points) AS x 
  FROM 
     ( SELECT @rank := 0 ) r
     , groups 
  LEFT 
  JOIN user_group 
    ON groups.id = user_groups.clan 
  LEFT 
  JOIN stats 
    ON user_groups.user = stats.id 
 GROUP  
    BY groups.id 
 ORDER 
    BY x DESC

RANK | points 
--------------
  47 |    3400     
  1  |    2500     
  75 |    1200     

如您所见,按点排序工作正常,但 Rank 变量似乎只是选择随机值。 谁能找到正确分配等级的方法?

使用子查询进行聚合和排序:

SELECT id, sum_points, @rank := @rank + 1 AS rank
FROM (SELECT g.id, SUM(s.points) AS sum_points
      FROM groups g LEFT JOIN
           user_group ug
           ON g.id = ug.clan LEFT JOIN
           stats s
           ON ug.user = s.id
      GROUP BY g.id
      ORDER BY sum_points DESC
     ) s CROSS JOIN
     (SELECT @rank := 0) params;

这一直是 MySQL 中的一个问题——变量不能很好地与聚合和排序一起工作。

请注意,在 MySQL 8+ 中,这更简单地写为:

SELECT g.id, SUM(s.points) AS sum_points,
       ROW_NUMBER() OVER (ORDER BY SUM(s.points) DESC) as rank
FROM groups g LEFT JOIN
     user_group ug
     ON g.id = ug.clan LEFT JOIN
     stats s
     ON ug.user = s.id
GROUP BY g.id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM