首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按用户在多行中的总分对mysql中的用户进行排序

按用户在多行中的总分对mysql中的用户进行排序
EN

Stack Overflow用户
提问于 2016-01-08 17:03:32
回答 3查看 981关注 0票数 0

我有非常类似的要求,如本问题所述。

mysql中的用户按其积分进行排名

唯一的区别是我的数据。以上问题的数据中,每个学生只有一行表。但在我的例子中,可能存在这样一种可能性,即表包含这样的单个学生的多行

  • 学生1分80分
  • 学生2分77.5
  • 学生2分4.5
  • 学生3分77
  • 学生4分77

因此,现在的排名应该根据用户拥有的点数(总计)的SUM来计算。所以在这种情况下,结果将是。

  • 学生2级,满分82分
  • 学生1级2,80分
  • 学生3,三级,77分
  • 学生4,三级,77分

用于数据

我试了几件事,解决了上面的问题,但没有得到结果。任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-08 19:06:39

在前面的答案中使用相同的查询,只需更改子查询的表学生,以组合每个学生的所有记录。

代码语言:javascript
复制
change [student er]  for 

(SELECT `id`, SUM(`points`) as `points`
 FROM students 
 GROUP BY `id`) er

SQL演示

代码语言:javascript
复制
select er.*,
       (@rank := if(@points = points, 
                    @rank, 
                    if(@points := points,    
                       @rank + 1, 
                       @rank + 1                       
                      )
                   )                  
       ) as ranking
from (SELECT `id`, SUM(`points`) as `points`
      FROM students 
      GROUP BY `id`) er cross join
     (select @rank := 0, @points := -1) params
order by points desc;

输出

代码语言:javascript
复制
| id | points | ranking |
|----|--------|---------|
|  5 |     91 |       1 |
|  6 |     81 |       2 |
|  1 |     80 |       3 |
|  2 |     78 |       4 |
|  3 |     78 |       4 |
|  4 |     77 |       5 |
|  7 |     66 |       6 |
|  8 |     15 |       7 |
票数 4
EN

Stack Overflow用户

发布于 2016-01-08 17:07:56

试试这个:

代码语言:javascript
复制
select id, points, @row := ifnull(@row, 0) + diff rank
from (select *, ifnull(@prev, 0) != points diff, @prev := points
      from (select id, sum(points) points
            from students
            group by 1
            order by 2 desc) x) y

请参阅SQLFiddle

票数 3
EN

Stack Overflow用户

发布于 2016-01-08 17:21:11

编辑:(这应该有效)

代码语言:javascript
复制
SELECT I.Id, I.Points, Rk.Rank
FROM
(SELECT Id, Points, @Rk := @Rk+1 As Rank
FROM (SELECT id, SUM(points) AS Points
      FROM students
      GROUP BY id
      ORDER BY Points DESC) As T,
      (SELECT @Rk := 0) AS Rk) As I
INNER JOIN
(SELECT * 
FROM (
    SELECT Id, Points, @Rk2 := @Rk2+1 As Rank
    FROM (SELECT id, SUM(points) AS Points
          FROM students
          GROUP BY id
          ORDER BY Points DESC) As T1,
          (SELECT @Rk2 := 0) AS Rk) AS T2
GROUP BY Points) As Rk
USING(Points)

产出如下:

代码语言:javascript
复制
| Id | Points |   Rank  |
|----|--------|---------|
|  5 |     91 |       1 |
|  6 |     81 |       2 |
|  1 |     80 |       3 |
|  2 |     78 |       4 |
|  3 |     78 |       4 |
|  4 |     77 |       6 |
|  7 |     66 |       7 |
|  8 |     15 |       8 |

在第4位的两个in之后,您将得到第6位,因为5个in位于第6位之前。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34682333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档