3

我正在尝试按我之前计算的分数对我的学生进行排名,但问题是如果学生的分数相同,他们应该在同一排名中

学生 1 满分 学生 2 满分

他们都必须排名为 1;

在此处输入图像描述 这是我的数据库的示例

我想要做的查询是(仅用于选择然后我可以将值插入我的列)

 SELECT  a.points
        count(b.points)+1 as rank
FROM  examresults a left join examresults b on a.points>b.points
group by  a.points;

编辑更清楚:

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

他们的队伍应该像

  • 学生 1 排名 1
  • 学生 2 等级 2
  • 学生 3 等级 2
  • 学生 4 等级 3

我当前的查询返回一个值,如

在此处输入图像描述

因为它缺少第三级。(因为第二名有 2 个值)

4

3 回答 3

2

这只是使用变量修复 Gordon 解决方案。问题是您的排名功能不是排名应该工作的方式。(学生 4 应该是 4 级)

SQL Fiddle Demo 您可以添加更多学生来改进测试。

select er.*,
       (@rank := if(@points = points, 
                    @rank, 
                    if(@points := points,    
                       @rank + 1, 
                       @rank + 1                       
                      )
                   )                  
       ) as ranking
from students er cross join
     (select @rank := 0, @points := -1) params
order by points desc;

输出

| id | points | ranking |
|----|--------|---------|
|  1 |     80 |       1 |
|  2 |     78 |       2 |
|  3 |     78 |       2 |
|  4 |     77 |       3 |
|  5 |     66 |       4 |
|  6 |     66 |       4 |
|  7 |     66 |       4 |
|  8 |     15 |       5 |
于 2016-01-06T20:11:23.943 回答
1

您需要一个真实的排名,它由 ANSI 标准rank()函数计算得出。您可以使用以下逻辑在 MySQL 中实现它:

select er.*,
       (select 1 + count(*)
        from examresults er2
        where er2.points > er.points
       ) as ranking
from exampleresults er;

对于较大的表,您可以使用变量来执行此操作,但这很尴尬:

select er.*,
       (@rank := if(@rn := @rn + 1              -- increment row number
                    if(@points = points, @rank, -- do not increment rank
                       if(@points := points,    -- set @points
                          @rn, @rn              -- otherwise use row number
                         )
                       )
                   )
       ) as ranking
from examresults er cross join
     (select @rn := 0, @rank := 0, @points := -1) params
order by points desc;
于 2016-01-06T16:31:43.787 回答
0

这个查询实现你想要的:

SELECT  student_id , points, (select count(distinct(points))+1 as rank 
from examresults internal 
where internal.points > external.points order by points)
FROM  examresults external 
group by  student_id
于 2016-01-06T16:49:37.240 回答