10 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個(gè)贊
樓主這問(wèn)題提的有點(diǎn)怪。擊敗率,無(wú)非就是分?jǐn)?shù)比自己低的人,兩條sql語(yǔ)句,一條交卷人數(shù)count,一條分?jǐn)?shù)比自己低的人數(shù)count,兩條sql語(yǔ)句不至于內(nèi)存溢出吧!
像樓主那個(gè)樣操作,每個(gè)人一提交,就更新之前所有提交的人的擊敗率,不內(nèi)存溢出才有鬼。
如果樓主把這個(gè)擊敗率當(dāng)成實(shí)時(shí)更新的字段。那只能用計(jì)劃任務(wù)定時(shí)更新。
感覺(jué)沒(méi)必要。一般來(lái)說(shuō)數(shù)據(jù)列表都會(huì)分頁(yè),遍歷的時(shí)候20條左右,就統(tǒng)計(jì)一次總?cè)藬?shù),然后這20 count比他分?jǐn)?shù)低的,花費(fèi)不了多少時(shí)間。至于后期如果要數(shù)據(jù)導(dǎo)出,怕影響效率,寫個(gè)腳本,直接把擊敗率一次性更新不就好了。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
記錄這次試題,規(guī)定一定時(shí)間內(nèi)完成,其他情況視為0分處理,等時(shí)間到了,把所有提交的數(shù)據(jù)全那出來(lái),自己排列計(jì)算,然后再賦值結(jié)果

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
0x1. 等所有學(xué)生都完成提交再做計(jì)算,最后得分根據(jù)交卷時(shí)間與成績(jī)排名
你應(yīng)該不是實(shí)時(shí)的把,即便是實(shí)時(shí)的你也可以做個(gè)`loding`,等確定所有人交卷完成再請(qǐng)求服務(wù)端進(jìn)行排名和擊敗率把
0x2. 交卷應(yīng)該有個(gè)統(tǒng)一等時(shí)間,比如答卷時(shí)間為120
分鐘
我覺(jué)得樓主最主要等是沒(méi)搞明白產(chǎn)品邏輯把 ,您的那個(gè)循環(huán)是搞什么...

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
學(xué)生提交卷子的時(shí)候計(jì)算這個(gè)人的擊敗率即可。
已經(jīng)提交完卷子的人再計(jì)算擊敗率沒(méi)有意義。所以你這個(gè)處理好就行,不用計(jì)算全部人

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
樓主的擊敗率是要保存到表里嗎?要是要保存到表里的話還是等都完成了之后再存比較好吧。
如果只是交卷的時(shí)候展示的話完全就不用太擔(dān)心了吧?

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
沒(méi)有必要實(shí)時(shí)計(jì)算所有人的擊敗率,
只需要在學(xué)生提交或者提交之后再次查詢時(shí)計(jì)算這一個(gè)學(xué)生的擊敗率即可,
分?jǐn)?shù)字段加個(gè)索引,每次計(jì)算一下分?jǐn)?shù)比他低的人有多少,
提交的總?cè)藬?shù)做一個(gè)計(jì)數(shù)器就可以,每提交一個(gè)+1,計(jì)算擊敗率直接拿過(guò)來(lái)用就行了,效率很高,
最多就是10000個(gè)人同時(shí)請(qǐng)求而已,這是并發(fā)需求,服務(wù)器處理就可以了

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
數(shù)據(jù)表中只記錄學(xué)生、分?jǐn)?shù)
create table stu(
stuid int,
score FLOAT
)
另外建個(gè)視圖
select stuid,(select count(1) from stu t2 where t2.score < t1.score)/(select count(*) from stu t3)*100 as beatRate
from stu t1

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
做個(gè)分組比較好,比如1-20分一組,20-40分一組.....
這樣統(tǒng)計(jì)每個(gè)組下的人數(shù)就好。
- 10 回答
- 0 關(guān)注
- 1051 瀏覽
添加回答
舉報(bào)