2016-01-06 9 views
3

我想通过自己的积分排名我的学生,我 之前计算,但问题是,如果学生有相同点,他们都应该在同级别 如排名用户可以通过自己的积分

学生1有满分 学生2有满分

他们都必须排名为1;

enter image description here 这里我的数据库

我试图做的查询是一个例子(只是选择那么我可以插入值,我的专栏)

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
  • 由于它缺少第三等级

我当前的查询返回类似

enter image description here

一个值。 (因为第二等级有2个值)

+0

让的说学生A和B有20分和C有18个,你要A和B是1级和C级2或3? –

+0

A和B级1和C等级2 –

回答

3

这只是使用变量的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 | 
+0

这确实一个'DENSE_RANK()',而不是一个等级。所以,它会返回1,1,1,2,而不是1,1,1,4。 。 。但这似乎是OP要求的。 –

+0

如果数据对同一个学生有多个行,那么你可以请你对你的查询做一些修改,然后我们需要根据该用户所有点的总和来计算排名。看到这个链接的数据http://sqlfiddle.com/#!9/95dff?谢谢 – Sachin

+0

@Sachin,对不起,我不明白,你是否与OP一起工作,需要一个新的要求?我没有看到OP说,一个学生可以有一个以上的积分结果 –

0

你想要一个真正的等级,它是由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; 
+0

你好检查我的编辑请我解释它简单 –

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 
+0

乌姆它没有实际工作 –

+0

检查我的编辑请我解释更新后,问题 –

+0

尝试 –

相关问题