Mysql 使用过滤器获取排名

Posted

技术标签:

【中文标题】Mysql 使用过滤器获取排名【英文标题】:Mysql Get Rank with Filters 【发布时间】:2012-12-28 04:16:50 【问题描述】:

我有一个标记表,例如:

ID STUDENT_ID Branch_id Class_id Exam_id Subject_id Numbers Date 1 653 5 1 1 8 60 2012-01-01 2 653 5 1 1 9 40 2012-01-01 3 653 5 1 1 10 80 2012-01-01 4 653 5 1 1 11 50 2012-01-01 5 653 5 1 1 12 65 2012-01-01 6 653 5 1 1 13 33 2012-01-01 7 653 5 1 1 15 86 2012-01-01 8 222 5 1 1 8 100 2012-01-01 9 222 5 1 1 9 80 2012-01-01 10 222 5 1 1 10 92 2012-01-01 11 222 5 1 1 11 50 2012-01-01 12 222 5 1 1 12 65 2012-01-01 13 222 5 1 1 13 33 2012-01-01 7 222 5 1 1 15 86 2012-01-01

如果一名或多名学生的排名相同,我需要知道学生的排名。并使用分支和类 ID 进行过滤。

谁能帮帮我?

【问题讨论】:

“如果一名或多名学生排名相同”是什么意思?排名,你的意思是ID吗?还是按“数字”列排名?如果任何两个学生的排名相同,您是否只想得到一个结果? 是的,如果两个学生的分数相等,我想知道结果。如果两个学生在 600 分的总分中得到 600 分,这意味着他们都在第一名。并且该位置取决于数字列的标记总和。 【参考方案1】:

试试这个:

SELECT STUDENT_ID, Numbers, IF(@marks=(@marks:=Numbers), @auto, @auto:=@auto+1) rank 
FROM (SELECT STUDENT_ID, Branch_id, Class_id, SUM(Numbers) Numbers
      FROM quiz_user 
      GROUP BY STUDENT_ID 
      ORDER BY Numbers DESC, STUDENT_ID 
     ) AS A, (SELECT @auto:=0, @marks:=0) AS B
WHERE Branch_id = 5 AND Class_id = 1; 

【讨论】:

【参考方案2】:
select sum(Numbers),STUDENT_ID,Branch_id,  Class_id
from marksheet 
where Branch_id='value' and Class_id='valueClass'
group by STUDENT_ID,Branch_id,  Class_id
order by sum(Numbers) desc

小提琴演示here

【讨论】:

@zia 你对这个查询有什么问题吗???那么您可以对此发表评论,而不是编辑我的答案。因为否则其他用户可能会混淆答案 好的抱歉编辑,但是当两个学生的分数相等时我没有得到答案。 @zia-我已经修改了fiidle答案-请在此处检查...sqlfiddle.com/#!2/b4c39/1根据它可以正常工作。如果不是,你期望什么样的输出? 先生,您的示例工作正常,但是当我在课堂上分配排名时,您可以在第二行看到 ID # 222(例如进入 while 循环并通过 $i 或其他方式分配排名)但这是错误的,因为 ID #222 也在第一位。 @Zia:您能否用您的特定示例所需的输出更新您的问题?

以上是关于Mysql 使用过滤器获取排名的主要内容,如果未能解决你的问题,请参考以下文章

使用 row_partition 内的过滤器过滤和排名(使用 row_partition)

我想通过附近的过滤器和距离的限制从mysql数据库中获取行

sql - 有没有办法过滤SELECT查询的结果,使用另一个SELECT查询?

尝试获取按 id 过滤的所有行并将它们作为数组(mysql,php)返回

基于未排序的列过滤排名

Pyspark - 过滤数据框并创建排名列