[请益] 分别找出学生成绩为几天新高

楼主: jami520 (我的生命因你而发光)   2015-12-06 07:48:06
目前有个成绩表会记录300个学生每天的成绩
目前我想做像下方这样呈现
学生姓名 成绩为几天新高分
学生A 5
学生B 32
学生C 18
学生D 3
............................
请问大家这样会如何做到上述的结果呢?
初步我是想说用循环跑三百个学生
而每个学生又再从最近的日期开始往前推去跑循环判读如下
do{
$sql="SELECT nameid FROM (SELECT grade, nameid FROM gradelist
where nameid=循环学生id and kdate=今天) a1
LEFT JOIN (SELECT MAX(grade) as MaxGrade, nameid FROM gradelist
where nameid=循环学生id and kdate<=今天 and kdate>=每天日期
group by nameid) a2 ON a1.nameid=a2.nameid
where a1.grade=ab2.MaxGrade";
}while(所有学生的循环);
当选出来为0笔的时候就终止循环,代表已经找到某学生成绩为几天的新高
然后再跑下一位学生的数据
感觉是不太聪明的做法,因为假设日期有300天好了
这样循环就要跑300学生*300天=9000个
不晓得是否有其他的做法可以做得到呢?
作者: ns1234 (FAR)   2015-12-06 12:00:00
group by user order by date desc?啊 where要判断q日期上面那句q 是多得 手机推文抱歉
楼主: jami520 (我的生命因你而发光)   2015-12-06 12:23:00
刚写得又修改了一下,应该是里面是跑所有学生的循环判断当笔数为0的时候则是代表有找到,然后可存到数据库中这是初步想到的方法,只是想说有否更好更快速的方式
作者: ns1234 (FAR)   2015-12-06 19:53:00
最外层跑每个学生没问题,里面 sql我只下了Select * from grade_list where create_time> '指定日期'and user_no= $iUserNo ORDER BY grade DESC LIMIT 1这样查询的次数是学生的数量 同样找不到就是其间没有分数不知道是不是你想问的答案(上面中间sql太复杂我看不懂
楼主: jami520 (我的生命因你而发光)   2015-12-06 22:59:00
但以一位学生来说,如何知道最近一天的成绩是往前推的几天新高分呢?
作者: ns1234 (FAR)   2015-12-06 23:12:00
"往前推几天新高分"是指 最后一次输入的成绩是否是新高分?
楼主: jami520 (我的生命因你而发光)   2015-12-07 12:38:00
假设最近五天分数为 89/67/55/93/72 那么最近一天的89分为近三天新高分,我想要得到的就是3天这个结果,包含所有学生的这个资料,因此我上面才会这样写,只是不知有否更好的方式吗?
作者: ns1234 (FAR)   2015-12-07 12:52:00
where createdate < -3天 order by grade, 不就可以只列出三天内的所有成绩,再排序挑最高分
楼主: jami520 (我的生命因你而发光)   2015-12-07 13:03:00
重点是一开始不知道是3天,所以跑学生循环之外,内部还要跑日期循环,从最近往前跑,因为每个学生新高天数不同啊
作者: ns1234 (FAR)   2015-12-07 13:11:00
等等。你的时间是每个人都一样,还是每个都不一样?我好像突然了解你要问什么了
楼主: jami520 (我的生命因你而发光)   2015-12-07 13:17:00
每个人时间都是不一样的,所以我才会列上面那个范例列表
作者: JustGame (JustGame)   2015-12-07 23:09:00
select d.nameid, count(d.id) from gradelist d, (select max(a.id) id, a.nameid from gradelist a, (selectid, nameid, grade from gradelist where kdate=今天) bwhere a.nameid=b.nameid and a.grade >= b.grade group by a.nameid) c where d.nameid = c.nameid and d.id<= c.id group by d.nameidc 的 where 少了一个 a.kdate < 今天
作者: xdraculax (首席怪叔叔)   2015-12-08 16:39:00
mysql 现在也可以写预存程序 storep什么的
作者: ns1234 (FAR)   2015-12-08 22:46:00
如果写暂存或是标flag会不会比较快啊?标记在最后一次新高
楼主: jami520 (我的生命因你而发光)   2015-12-11 14:02:00
感谢各位大大的回复,多了些方法可以学习测试一下,谢谢!
作者: ChenCH1986 (Chen,C.H.)   2015-12-17 09:43:00
我的建议是直接开另外一张表来储存学生是几天新高的透过trigger去控制更新那一张储存几天新高的表格否则针对那么庞大的资料, 每次捞取都得跑一次, 很容易造成服务器负担

Links booklink

Contact Us: admin [ a t ] ucptt.com