【问题标题】:Mysql Get Rank with FiltersMysql 使用过滤器获取排名
【发布时间】: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 分,这意味着他们都在第一名。并且该位置取决于数字列的标记总和。

标签: mysql select group-by ranking


【解决方案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:您能否用您的特定示例所需的输出更新您的问题?
    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多