我也搜索并搜索了这个堆栈网站,并且无法找到至少给我一些关于如何实现这一点的想法。我计算了学生总数的总和,并确定了与sql变量的关系。每个学生有五个科目,可以在一周内进行多次测试。我想跳过一个从排名中得分低于每个科目总分的35%的学生。例如,一名学生获得英语100分中的40分,MIL中100分中的59分,“科学”中130分中的110分,数学中120分中的98分,SS中的33分中的33分。如果每个主题的满标记为100,我可以使用以下查询进行计算:
SELECT regd,
English, MIL,
Mathematics, SS,
Science,
score, fmscore, perc, Rank
FROM
(
SELECT t.*, IF(@p = score, @n, @n := @n + 1) AS Rank, @p := score
FROM
(
SELECT regd,
SUM(IF(Subject = 'English' , Mark_score, 0)) English,
SUM(IF(Subject = 'MIL' , Mark_score, 0)) MIL,
SUM(IF(Subject = 'Mathematics', Mark_score, 0)) Mathematics,
SUM(IF(Subject = 'SS' , Mark_score, 0)) SS,
SUM(IF(Subject = 'Science' , Mark_score, 0)) Science,
SUM(Full_mark) fmscore,
SUM(Mark_score) score,
SUM(Mark_score) / SUM(Full_mark) * 100 perc
FROM exam e1, (SELECT @n := 0, @p := 0) n
WHERE NOT EXISTS (SELECT null from exam e2 WHERE e1.regd = e2.regd
AND e2.Mark_score/e2.Full_mark<0.35)
GROUP BY regd
ORDER BY score DESC
) t
) r;
由于每个主题的满标记不同而不是100,因此对于那些在一个或多个主题中得分低于满分35%的学生,代码无法正确跳过排名。如果单独使用mysql无法实现这一点,那么使用php数组会有什么可能吗?在考试表中,id是主键,regd被索引。这是我的项目,我已经被困在这里一个月了。请帮帮我。
答案 0 :(得分:0)
您需要首先按主题分组数据regd。 这样您就可以计算出每个主题的百分比,并删除那些低于定义限制的人。完成此操作后,您可以携带此输出并用于显示和创建Rank。你可以使用类似下面的查询。
select regd, SUM(IF(Subject = 'English' , Mark_score, 0)) English,
SUM(IF(Subject = 'MIL' , Mark_score, 0)) MIL,
SUM(IF(Subject = 'Mathematics', Mark_score, 0)) Mathematics,
SUM(IF(Subject = 'SS' , Mark_score, 0)) SS,
SUM(IF(Subject = 'Science' , Mark_score, 0)) Science,
Mark_score, Perc
from (
SELECT regd, Subject,(SUM(Mark_score) / SUM(Full_mark) * 100) Perc , (SUM(Mark_score)) Mark_score
FROM exam e1
GROUP BY regd, Subject
having perc > 35
) as t
order by Mark_score;