Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按分数对mysql中的用户进行排名_Mysql_Sql_Sorting_Ranking_Mysql Variables - Fatal编程技术网

按分数对mysql中的用户进行排名

按分数对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得满分 学生2得了满分

它们都必须排名为1

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

我尝试执行的查询是(仅针对select,然后我可以将值插入到我的列中)

编辑以使其更清晰:

  • 学生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,没问题。我刚刚提出了一个新问题,你能研究一下吗。。