Php和Mysql根据学生的总分对他们进行排名并给出答案。如果他们是平手,也不能连续排名
我有一个非常简单的MySQL表,其中保存了每个学生的考试和CA分数以及他们的管理员号。它看起来像: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
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