[請益] 分別找出學生成績為幾天新高

作者: 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