2013-01-16 96 views
1

我有一个结果表所示:动态获取排名由MySQL查询

 

ID STUDENT_ID Branch_id Class_id Exam_id Subject_id Numbers  Date 
1  653   5   1   1 8    60  2012-01-01 
2  653   5   1   1 9    40  2012-01-01 
3  653   5   1   1 10    80  2012-01-01 
4  653   5   1   1 11    50  2012-01-01 
5  653   5   1   1 12    65  2012-01-01 
6  653   5   1   1 13    33  2012-01-01 
7  653   5   1   1 15    86  2012-01-01 
8  222   5   1   1 8    100  2012-01-01 
9  222   5   1   1 9    80  2012-01-01 
10  222   5   1   1 10    92  2012-01-01 
11  222   5   1   1 11    50  2012-01-01 
12  222   5   1   1 12    65  2012-01-01 
13  222   5   1   1 13    33  2012-01-01 
7  222   5   1   1 15    86  2012-01-01 

我的愿望结果,如:

 

Student_ID Math English  Science Total Rank 
1  90 89  88 267 1 
2  90 89  88 267 1 
3  58 45  98 201  2 


我想用这种方法让学生排名:

​​

SET @rank = 0, @prev_val = NULL; 

SELECT rank, correct FROM 
(
    SELECT 
     @rank := IF(@prev_val=correct,@rank,@rank+1) AS rank, 
     @prev_val := correct AS correct, uid 
    FROM quiz_user 
    ORDER BY correct DESC 
)as result WHERE uid=xxxxxxxxxxxx 

这个查询我只需要区别表结构作者的帖子在正确的列上分配一个等级,我需要在总和所有数字之后在数字SUM(数字)列上指定等级。

请帮忙。

+0

请clearify你想要什么你的问题? –

+0

如果一个或多个学生的成绩相同,我想获得学生的排名:两名学生在500分中获得500分,这意味着两个学生都处于第一位。所以在上面的查询工作正常,如果两个是平等的只有我想计算排名上SUM(数字),而不是正确的列。 – Zia

+0

你能提供这个样本数据的模式吗? –

回答

1

试试这个:

SELECT STUDENT_ID, Numbers, IF(@marks=(@marks:=Numbers), @auto, @auto:[email protected]+1) rank 
FROM (SELECT STUDENT_ID, SUM(Numbers) Numbers 
     FROM quiz_user 
     GROUP BY STUDENT_ID 
     ORDER BY Numbers DESC, STUDENT_ID 
    ) AS A, (SELECT @auto:=0, @marks:=0) AS B; 
+0

我想问另一个问题?为所有职级。 – Zia

+0

@Zia想问什么?解释我 –

+0

我使用数据透视查询类如: SELECT MA_TH,(IF(subject_id = 1),sum(numbers)AS total,branch_id,depart_id,class_id,SUM(IF(subject_id = 1,numbers,0) 2,numbers,0))AS Eng, SUM(IF(subject_id = 3,numbers,0))AS URDU FROM marksheet where branch_id = 1 AND depart_id = 1 AND class_id = 1 GROUP BY stu_id ORDER BY total DESC 以excel格式显示所有班级成绩。我也可以在这个查询中获得排名吗? – Zia