按分数对mysql中的用户进行排名
我试图根据我以前计算过的学生分数对他们进行排名 但问题是,如果学生们的分数相同,他们就应该处于同一等级 例如 学生1得满分 学生2得了满分 它们都必须排名为1 这里是我的数据库的一个例子 我尝试执行的查询是(仅针对select,然后我可以将值插入到我的列中) 编辑以使其更清晰:按分数对mysql中的用户进行排名,mysql,sql,sorting,ranking,mysql-variables,Mysql,Sql,Sorting,Ranking,Mysql Variables,我试图根据我以前计算过的学生分数对他们进行排名 但问题是,如果学生们的分数相同,他们就应该处于同一等级 例如 学生1得满分 学生2得了满分 它们都必须排名为1 这里是我的数据库的一个例子 我尝试执行的查询是(仅针对select,然后我可以将值插入到我的列中) 编辑以使其更清晰: 学生1分80分 学生2分77.5分 学生3分77.5 学生4分77分 他们的队伍应该是 学生1排名1 学生2排名2 学生3等级2 学生4等级3 我当前的查询返回的值如下 因为它缺少第三级。(因为第二个秩有2个
- 学生1分80分
- 学生2分77.5分
- 学生3分77.5
- 学生4分77分
- 学生1排名1
- 学生2排名2
- 学生3等级2
- 学生4等级3
因为它缺少第三级。(因为第二个秩有2个值)您需要一个实际秩,它是由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;
您需要一个实际的秩,它由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;
此查询实现了您想要的功能:
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
此查询实现了您想要的功能:
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
这只是使用变量的Gordon解决方案的修复。问题是你的排名函数不是排名应该起作用的方式。(学生4应为4级) 您可以添加更多学生以改进测试 输出
| 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 |
这只是使用变量的Gordon解决方案的修复。问题是你的排名函数不是排名应该起作用的方式。(学生4应为4级) 您可以添加更多学生以改进测试 输出
| 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 |
假设学生A和B得20分,C得18分,你想让A和B排名1,C排名2或3?A和B排名1和C排名2让我们假设学生A和B得20分,C排名18分,你想让A和B排名1和C排名2或3?A和B排名1和C排名2恐怕仍然不起作用。SELECT列表的表达式#2不在GROUP BY子句中,并且包含未聚合的列“onlineform_1.external.points”,该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容。如果我按部分删除组,则会完全出错。很抱歉,仍然无法工作。SELECT列表的表达式#2不在GROUP BY子句中,并且包含未聚合的列“onlineform_1.external.points”,该列在功能上不依赖于GROUP BY子句中的列;这与sql\u mode=only\u full\u group\u by不兼容。如果我按部分删除组,那么它会完全出错。这是一个
密集列组()
,而不是列组。因此,它将返回1,1,1,2,而不是1,1,1,4。但这似乎是OP所要求的。如果同一个学生的数据有多行,那么我们需要根据该用户所有分数的总和计算排名,请您对您的查询进行一些修改。有关数据,请参见此链接?thanks@Sachin,对不起,我不明白,您是否与OP合作并需要新的要求?我不认为一个学生可以有超过一个点result@Sachin如果你在一个类似但不同的问题上需要帮助,只需创建一个新问题,我会帮助你,让我知道。但我不能改变这个答案,因为它与这个问题有关。@JuanCarlosOropeza,没问题。我刚刚提出了一个新问题,你能研究一下吗。。这是一个密集列组()
,而不是列组。因此,它将返回1,1,1,2,而不是1,1,1,4。但这似乎是OP所要求的。如果同一个学生的数据有多行,那么我们需要根据该用户所有分数的总和计算排名,请您对您的查询进行一些修改。有关数据,请参见此链接?thanks@Sachin,对不起,我不明白,您是否与OP合作并需要新的要求?我不认为一个学生可以有超过一个点result@Sachin如果你在一个类似但不同的问题上需要帮助,只需创建一个新问题,我会帮助你,让我知道。但我不能改变这个答案,因为它与这个问题有关。@JuanCarlosOropeza,没问题。我刚刚提出了一个新问题,你能研究一下吗。。