看板 PHP 關於我們 聯絡資訊
目前有個成績表會記錄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個 不曉得是否有其他的做法可以做得到呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 182.235.190.240 ※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1449359289.A.252.html
ns1234: group by user order by date desc? 12/06 12:00
ns1234: 啊 where要判斷q日期 12/06 12:01
ns1234: 上面那句q 是多得 手機推文抱歉 12/06 12:01
※ 編輯: jami520 (182.235.190.240), 12/06/2015 12:23:14
jami520: 剛寫得又修改了一下,應該是裡面是跑所有學生的迴圈判斷 12/06 12:23
jami520: 當筆數為0的時候則是代表有找到,然後可存到資料庫中 12/06 12:25
jami520: 這是初步想到的方法,只是想說有否更好更快速的方式 12/06 12:25
ns1234: 最外層跑每個學生沒問題,裡面 sql我只下了 12/06 19:53
ns1234: Select * from grade_list where create_time> '指定日期' 12/06 19:54
ns1234: and user_no= $iUserNo ORDER BY grade DESC LIMIT 1 12/06 19:55
ns1234: 這樣查詢的次數是學生的數量 同樣找不到就是其間沒有分數 12/06 19:56
ns1234: 不知道是不是你想問的答案(上面中間sql太複雜我看不懂 12/06 20:00
jami520: 但以一位學生來說,如何知道最近一天的成績是往前推的幾 12/06 22:59
jami520: 天新高分呢? 12/06 23:00
ns1234: "往前推幾天新高分"是指 最後一次輸入的成績是否是新高分? 12/06 23:12
jami520: 假設最近五天分數為 89/67/55/93/72 那麼最近一天的89分 12/07 12:38
jami520: 為近三天新高分,我想要得到的就是3天這個結果,包含所有 12/07 12:39
jami520: 學生的這個資料,因此我上面才會這樣寫,只是不知有否 12/07 12:39
jami520: 更好的方式嗎? 12/07 12:39
ns1234: where createdate < -3天 order by grade, 不就可以只列 12/07 12:52
ns1234: 出三天內的所有成績,再排序挑最高分 12/07 12:52
jami520: 重點是一開始不知道是3天,所以跑學生迴圈之外,內部還要 12/07 13:03
jami520: 跑日期迴圈,從最近往前跑,因為每個學生新高天數不同啊 12/07 13:04
ns1234: 等等。你的時間是每個人都一樣,還是每個都不一樣? 12/07 13:11
ns1234: 我好像突然了解你要問什麼了 12/07 13:13
jami520: 每個人時間都是不一樣的,所以我才會列上面那個範例列表 12/07 13:17
JustGame: select d.nameid, count(d.id) from gradelist d, (sele 12/07 23:09
JustGame: ct max(a.id) id, a.nameid from gradelist a, (select 12/07 23:10
JustGame: id, nameid, grade from gradelist where kdate=今天) b 12/07 23:10
JustGame: where a.nameid=b.nameid and a.grade >= b.grade grou 12/07 23:11
JustGame: p by a.nameid) c where d.nameid = c.nameid and d.id< 12/07 23:12
JustGame: = c.id group by d.nameid 12/07 23:12
JustGame: c 的 where 少了一個 a.kdate < 今天 12/07 23:14
xdraculax: mysql 現在也可以寫預存程序 storep什麼的 12/08 16:39
ns1234: 如果寫暫存或是標flag會不會比較快啊?標記在最後一次新高 12/08 22:46
jami520: 感謝各位大大的回覆,多了些方法可以學習測試一下,謝謝! 12/11 14:02
ChenCH1986: 我的建議是直接開另外一張表來儲存學生是幾天新高的 12/17 09:43
ChenCH1986: 透過trigger去控制更新那一張儲存幾天新高的表格 12/17 09:44
ChenCH1986: 否則針對那麼龐大的資料, 每次撈取都得跑一次, 很容易 12/17 09:44
ChenCH1986: 造成伺服器負擔 12/17 09:44