-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

即使有两个学生的分数相等,我也需要在课堂上获得学生的排名。例如,如果两名学生在 600 分中获得 600 分,则意味着他们都在第一名。

我搜索了很多网站,发现这篇文章可以满足我的需要,但在这篇文章中,正确的列已经是总分,但在我的表中,我需要求和(数字),然后根据总分获得学生的排名。

这一切都是在我获取单个学生的结果时发生的。

当我为所有类获取结果时,相同的数据有两件事需要。第一行到列的透视查询以 excel 格式显示结果,因此我使用行到列查询,例如:

SELECT m.* 
FROM (
   select student_id, branch_id, class_id, numbers,  exam_id, date
        , sum(numbers*(1-abs(sign(subject_id-1)))) as subs1
        , sum(numbers*(1-abs(sign(subject_id-2)))) as subs2
        , sum(numbers*(1-abs(sign(subject_id-3)))) as subs3
        , sum(numbers*(1-abs(sign(subject_id-4)))) as subs4
        , sum(numbers*(1-abs(sign(subject_id-5)))) as subs5
        , sum(numbers*(1-abs(sign(subject_id-6)))) as subs6 
   from results 
   GROUP BY student_id, branch_id, class_id,  exam_id
   ) m 
where branch_id = '6' 
 and class_id = '1' 
 and exam_id = '1' 
 and YEAR(date) = '2013' 

所需的结果在类查询中,例如:

ID 姓名 数学 英语 科学 总百分比 位置 排名

我通过这个查询得到了很好的结果。但是排名仍然存在问题如何在同一查询中获得学生的排名?

任何人都可以帮忙吗?

4

1 回答 1

1

我的问题是如何使用 SUM(numbers) 而不是正确的,因为在帖子查询中正确答案已经相加。

从子查询而不是表中选择。

第二个……</p>

我不完全理解你的第二个问题,也没有看到与第一个问题的关系。请写单独的帖子以提出单独的问题。

sum(numbers*(1-abs(sign(subject_id-1))))

你可以这样写,sum(numbers*(subject_id = 1))因为 MySQL 在评估类似这种比较的布尔运算时使用 0 表示 false 和 1 表示 true。

还有一点需要注意:将WHERE条件移动到 subquery中会更好m

于 2013-01-14T07:59:02.557 回答