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

看板PHP作者 (我的生命因你而發光)時間8年前 (2015/12/06 07:48), 8年前編輯推噓8(8031)
留言39則, 5人參與, 最新討論串1/2 (看更多)
目前有個成績表會記錄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

12/06 12:00, , 1F
group by user order by date desc?
12/06 12:00, 1F

12/06 12:01, , 2F
啊 where要判斷q日期
12/06 12:01, 2F

12/06 12:01, , 3F
上面那句q 是多得 手機推文抱歉
12/06 12:01, 3F
※ 編輯: jami520 (182.235.190.240), 12/06/2015 12:23:14

12/06 12:23, , 4F
剛寫得又修改了一下,應該是裡面是跑所有學生的迴圈判斷
12/06 12:23, 4F

12/06 12:25, , 5F
當筆數為0的時候則是代表有找到,然後可存到資料庫中
12/06 12:25, 5F

12/06 12:25, , 6F
這是初步想到的方法,只是想說有否更好更快速的方式
12/06 12:25, 6F

12/06 19:53, , 7F
最外層跑每個學生沒問題,裡面 sql我只下了
12/06 19:53, 7F

12/06 19:54, , 8F
Select * from grade_list where create_time> '指定日期'
12/06 19:54, 8F

12/06 19:55, , 9F
and user_no= $iUserNo ORDER BY grade DESC LIMIT 1
12/06 19:55, 9F

12/06 19:56, , 10F
這樣查詢的次數是學生的數量 同樣找不到就是其間沒有分數
12/06 19:56, 10F

12/06 20:00, , 11F
不知道是不是你想問的答案(上面中間sql太複雜我看不懂
12/06 20:00, 11F

12/06 22:59, , 12F
但以一位學生來說,如何知道最近一天的成績是往前推的幾
12/06 22:59, 12F

12/06 23:00, , 13F
天新高分呢?
12/06 23:00, 13F

12/06 23:12, , 14F
"往前推幾天新高分"是指 最後一次輸入的成績是否是新高分?
12/06 23:12, 14F

12/07 12:38, , 15F
假設最近五天分數為 89/67/55/93/72 那麼最近一天的89分
12/07 12:38, 15F

12/07 12:39, , 16F
為近三天新高分,我想要得到的就是3天這個結果,包含所有
12/07 12:39, 16F

12/07 12:39, , 17F
學生的這個資料,因此我上面才會這樣寫,只是不知有否
12/07 12:39, 17F

12/07 12:39, , 18F
更好的方式嗎?
12/07 12:39, 18F

12/07 12:52, , 19F
where createdate < -3天 order by grade, 不就可以只列
12/07 12:52, 19F

12/07 12:52, , 20F
出三天內的所有成績,再排序挑最高分
12/07 12:52, 20F

12/07 13:03, , 21F
重點是一開始不知道是3天,所以跑學生迴圈之外,內部還要
12/07 13:03, 21F

12/07 13:04, , 22F
跑日期迴圈,從最近往前跑,因為每個學生新高天數不同啊
12/07 13:04, 22F

12/07 13:11, , 23F
等等。你的時間是每個人都一樣,還是每個都不一樣?
12/07 13:11, 23F

12/07 13:13, , 24F
我好像突然了解你要問什麼了
12/07 13:13, 24F

12/07 13:17, , 25F
每個人時間都是不一樣的,所以我才會列上面那個範例列表
12/07 13:17, 25F

12/07 23:09, , 26F
select d.nameid, count(d.id) from gradelist d, (sele
12/07 23:09, 26F

12/07 23:10, , 27F
ct max(a.id) id, a.nameid from gradelist a, (select
12/07 23:10, 27F

12/07 23:10, , 28F
id, nameid, grade from gradelist where kdate=今天) b
12/07 23:10, 28F

12/07 23:11, , 29F
where a.nameid=b.nameid and a.grade >= b.grade grou
12/07 23:11, 29F

12/07 23:12, , 30F
p by a.nameid) c where d.nameid = c.nameid and d.id<
12/07 23:12, 30F

12/07 23:12, , 31F
= c.id group by d.nameid
12/07 23:12, 31F

12/07 23:14, , 32F
c 的 where 少了一個 a.kdate < 今天
12/07 23:14, 32F

12/08 16:39, , 33F
mysql 現在也可以寫預存程序 storep什麼的
12/08 16:39, 33F

12/08 22:46, , 34F
如果寫暫存或是標flag會不會比較快啊?標記在最後一次新高
12/08 22:46, 34F

12/11 14:02, , 35F
感謝各位大大的回覆,多了些方法可以學習測試一下,謝謝!
12/11 14:02, 35F

12/17 09:43, , 36F
我的建議是直接開另外一張表來儲存學生是幾天新高的
12/17 09:43, 36F

12/17 09:44, , 37F
透過trigger去控制更新那一張儲存幾天新高的表格
12/17 09:44, 37F

12/17 09:44, , 38F
否則針對那麼龐大的資料, 每次撈取都得跑一次, 很容易
12/17 09:44, 38F

12/17 09:44, , 39F
造成伺服器負擔
12/17 09:44, 39F
文章代碼(AID): #1MOtUv9I (PHP)
文章代碼(AID): #1MOtUv9I (PHP)