首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql中的用户按其积分进行排名

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

Stack Overflow用户
提问于 2016-01-06 16:29:49
回答 3查看 1.6K关注 0票数 3

我试图用我以前计算过的分数来给我的学生排序,但问题是,如果学生有相同的分数,他们应该是相同的等级,例如

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

他们都必须是1级;

这里是我的数据库的一个例子

我要做的查询是(只是为了选择,然后我可以将值插入到我的列中)

代码语言:javascript
复制
 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

我的当前查询返回的值如下

因为它失去了第三级。(因为二级有两个值)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-06 20:11:23

这只是戈登使用变量解决方案的一个修正。问题是,你的排名功能不是排名应该工作的方式。(学生4应为4级)

SQL Fiddle演示你可以增加更多的学生来改进考试。

代码语言:javascript
复制
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;

输出

代码语言:javascript
复制
| 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 |
票数 2
EN

Stack Overflow用户

发布于 2016-01-06 16:31:43

您需要一个真正的等级,这是由ANSI标准rank()函数计算的。您可以使用以下逻辑在MySQL中实现这一点:

代码语言:javascript
复制
select er.*,
       (select 1 + count(*)
        from examresults er2
        where er2.points > er.points
       ) as ranking
from exampleresults er;

对于较大的表,可以使用变量来实现这一点,但这是一个相当尴尬的问题:

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2016-01-06 16:49:37

此查询实现了您想要的结果:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34637943

复制
相关文章

相似问题

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