跳过不符合Mysql排序等级所需值的行中的排名?

时间:2014-03-24 14:06:00

标签: php mysql ranking

我也搜索并搜索了这个堆栈网站,并且无法找到至少给我一些关于如何实现这一点的想法。我计算了学生总数的总和,并确定了与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被索引。这是我的项目,我已经被困在这里一个月了。请帮帮我。

1 个答案:

答案 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;