我试图用我以前计算过的分数来给我的学生排序,但问题是,如果学生有相同的分数,他们应该是相同的等级,例如
学生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;编辑更清晰:
他们的队伍应该像
我的当前查询返回的值如下

因为它失去了第三级。(因为二级有两个值)
发布于 2016-01-06 20:11:23
这只是戈登使用变量解决方案的一个修正。问题是,你的排名功能不是排名应该工作的方式。(学生4应为4级)
SQL Fiddle演示你可以增加更多的学生来改进考试。
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-06 16:31:43
您需要一个真正的等级,这是由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-06 16:49:37
此查询实现了您想要的结果:
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_idhttps://stackoverflow.com/questions/34637943
复制相似问题