Php和Mysql根据学生的总分对他们进行排名并给出答案。如果他们是平手,也不能连续排名

Php和Mysql根据学生的总分对他们进行排名并给出答案。如果他们是平手,也不能连续排名,php,mysql,Php,Mysql,我有一个非常简单的MySQL表,其中保存了每个学生的考试和CA分数以及他们的管理员号。它看起来像: admin_no subject ca exam year class_s 10/00182 IRS 39 56 2014/2015 Grade 2 10/00177 English 39 59 2014/2015 Grade 2 10/00177 Mathematics 34 59

我有一个非常简单的MySQL表,其中保存了每个学生的考试和CA分数以及他们的管理员号。它看起来像:

 admin_no   subject     ca  exam    year       class_s 
10/00182     IRS        39  56    2014/2015     Grade 2
10/00177    English     39  59    2014/2015     Grade 2
10/00177    Mathematics 34  59    2014/2015     Grade 2
10/00177    Basic       37  59    2014/2015     Grade 2
10/00177    Social      39  60    2014/2015     Grade 2
10/00177    Yoruba      33  59    2014/2015     Grade 2
09/00159    English     37  59    2014/2015     Grade 2
09/00159    Mathematics 35  60    2014/2015     Grade 2
09/00159    Basic       39  59    2014/2015     Grade 2
.......................................................
我使用下面的mysql查询对所有科目的but考试分数和CA进行汇总,然后将每个学生的所有分数相加,作为总分,然后对总分进行排名:

SELECT admin_no,rank,total_score
FROM (SELECT *,  IF(@marks=(@marks:=total_score), @auto, @auto:=@auto+1) AS rank 
FROM (SELECT * FROM 
  (SELECT admin_no, SUM(exam)+SUM(ca) AS total_score,year,class_s
    FROM subjects_1 ,
    (SELECT @auto:=0, @marks:=0) as init WHERE `class_s`='Grade 2' and `year`='2014/2015'
     GROUP BY admin_no ) sub ORDER BY total_score DESC)t) as result 
查询的输出:

 admin_no   rank total_score    
08/00076    1   1615
10/00170    2   1613
12/00300    3   1609
09/00091    4   1604
10/00182    5   1600
09/00159    6   1583
10/00177    7   1574
09/00152    8   1561
09/00165    9   1540
10/00176    10  1516
13/00354    11  1497
10/00178    12  1470
14/00348    13  1409
**14/00346  14  12
15/00371    14  12
09/00156    15  7**
问题:输出是好的,但在最后三个等级中的计数有问题。即总分12在14/00346和15/00371中出现两次,他们被给予相同的等级,这是好的,但在12之后是7,排名15而不是17。请帮助我,我不希望排名是连续的,如果他们是在总的_分数平局

下面是我的mysql数据的副本

下面是php查询代码

试试这个

我没有把年份和类别包括在内,因为您可能无法获得可靠的行集,因为您是按管理员编号分组的

我已经包括了排名和竞争排名——选择你需要的那一个

更多信息请点击此处:

我不知道并列时谁的排名更高的指导原则,但作为一项建议,您可以计算学生学习的科目数,以确定SQL中包含的科目数

SET @prev_value = NULL;
SET @rank_count = 0;
SET @rank_increasing = 0;
SELECT @rank_increasing := @rank_increasing + 1 AS ordinal_rank
     , CASE
       WHEN @prev_value = a.total_score
          THEN @rank_count
       WHEN @prev_value := a.total_score
          THEN @rank_count := @rank_increasing 
        END AS competition_rank
     , a.*
  FROM ( SELECT admin_no
              , SUM(exam) + SUM(ca) AS total_score
              , SUM(exam) AS sum_exam
              , SUM(ca) AS sum_ca
              , COUNT(DISTINCT subject) AS subject_count
           FROM subjects_1
          GROUP BY admin_no
          ORDER BY total_score DESC
       ) a
截图片段


如果我理解正确的话,你想增加排名,即使是平局?如果是这样,您应该能够通过删除If语句并仅调用@auto:=@auto+1来实现这一点。唯一的问题是,你如何决定谁的排名是14和15?MySQL会帮你解决这个问题,但结果可能是断断续续的。@jeroen非常感谢你,我删除了if语句,并使用了以下内容:选择管理号,排名,总评分,选择@auto:=@auto+1作为选择的排名,选择管理号,sumcean+SUMca作为总评分,年份,课程,选择@auto:=0,@marks:=0作为初始值,其中class='Grade 2'和year='2014/2015'组由管理员确定,没有子订单由总分确定。因此,请将我带到您提到的另一个问题级别,即为同一总分赋予不同的等级。请帮我提供一个完整的代码来处理此问题。感谢DoubleSidedStickytape谢谢先生,请仍然等待如何得到这个脚本正确的排名对不起,我现在不在家。很好,双簧管你几乎可以做到这一点-当总分相等时,还有什么决定因素可以决定谁获得更高的排名?不久前,我问了一个关于MySQL排名的正确方法的问题-这有帮助吗?事实上,谢谢你,老板!你确实解决了我意想不到的问题。再次感谢你百亿次。干杯好东西。很高兴被分类了,但还有一个问题,先生,我想选择一班中某位成员的级别。e 10/00170请告知我该怎么做,我已经尝试过了,但出现了错误:。。。。。。。。。。。。。。。。。。。。从中选择管理编号、SUMCEAM+SUMca作为总分、SUMCEAM作为总分、SUMCEAM作为总分、SUMca作为总分,将不同的受试者作为受试者计数,其中等级为2级的受试者和2014/2015年的受试者组按管理员分类,无顺序,按总分描述,其中管理员编号为10/00170限制1,结果更新的频率是多少?如果是每年一次,也许您可以将结果集存储在“排名”表中,其中包含排名、分数和年份。这样你就不用每次都计算排名了。但是我的排名错了,它给学生的排名是1,而不是2