2013-10-19 40 views
0

我有一个类似于下面显示的数据库的学生考试数据的数据库。我试图通过将所有科目的MarksSubj)作为一个学期(Sem)的总和并将其相应地排序来为这些学生分配ranks通过取得一个colomn的值的总和MySQL订单表

因此,如果这是原始DB:

Name | S.NO.| Subj | Sem | Marks | Rank 
    ab | B1 | C1 | 1 | 002 | 
    ab | B1 | C2 | 1 | 004 | 
    ab | B1 | C3 | 1 | 005 | 
    ab | B1 | C4 | 2 | 008 | 

    xy | C2 | C1 | 1 | 006 | 
    xy | C2 | C2 | 1 | 004 | 
    xy | C2 | C3 | 2 | 007 | 
    xy | C2 | C4 | 2 | 009 | 
    xy | C2 | C5 | 2 | 003 | 

    sm | Z1 | C1 | 1 | 006 | 
    sm | Z1 | C2 | 2 | 004 | 
    sm | Z1 | C3 | 2 | 008 | 

我想将它转换成:

Name | S.NO.| Subj | Sem | Marks | Rank 
    ab | B1 | C1 | 1 | 002 | 1(coz his total is 11 in sem 1) 
    ab | B1 | C2 | 1 | 004 | 1 
    ab | B1 | C3 | 1 | 005 | 1 

    ab | B1 | C4 | 2 | 008 | 3 

    xy | C2 | C1 | 1 | 006 | 2 
    xy | C2 | C2 | 1 | 004 | 2 

    xy | C2 | C3 | 2 | 007 | 1(coz his total is 19 in Sem 2) 
    xy | C2 | C4 | 2 | 009 | 1 
    xy | C2 | C5 | 2 | 003 | 1 

    sm | Z1 | C1 | 1 | 006 | 3 

    sm | Z1 | C2 | 2 | 004 | 2 
    sm | Z1 | C3 | 2 | 008 | 2 

该数据库拥有约30万行。

+0

自定义RANK OVER在MySQL中很重要,它不会在大型桌面上扩展......您的桌子变得多大? –

+2

为什么不用另一张桌子,只有一个学生姓名(或数字),一个学期和一些标记? – Ashalynd

+0

这是一个300-500K行的godaddy帐户,它真的很难这样做,因为它会给我一个连接超时错误 – jaisonDavis

回答

1

这是你想要

select name,sno,subj,sem,mark,rank 
from 
(
select e1.* 
     , @sm:=(select sum(e2.mark) from exams e2 where e1.name=e2.name and e1.sem=e2.sem) summark 
     , case when @sem!=sem then @r:=1 
       when @s [email protected] then @r:[email protected]+1 
          else @r 
     end as rank 
     , @s:[email protected] 
     , @sem:=sem 
     from exams e1,(select @r:=0, @s:=0,@sm:=0,@sem:=0) r 
order by sem,summark desc 
) r2  
order by sno,subj; 

我不知道运行什么。这可能需要一点。

演示在SQL小提琴:http://sqlfiddle.com/#!9/b0290/1

要解释一下上面。 MySQL不像其他数据库(例如Oracle)那样具有分析功能。但上面的模拟它。 @sm是标记的总和。 @r是排名变量。如果标记总和发生变化,则会增加。在学期更改时重置为1。 @s保存前一行的总和并且@sem保存上一行的学期。

+0

对不起,迟到的评论..javascript被阻止在我的comp..took一段时间,使其工作。 ..关于代码:AMAZING – jaisonDavis

+0

非常感谢mate ..这就像一个魅力...非常感谢... – jaisonDavis

+0

和时间..它需要一点时间,但是当我创建一个新的与它的表,它只需要一小部分时间。再次感谢一大批 – jaisonDavis