|
楼主 |
发表于 2009-6-19 22:22:12
|
显示全部楼层
来自 中国–浙江–杭州
171# eason39
改成读acess数据库就可以了。
等下试下看改下能不能用。
不过楼主如果放出插件的相关部分源代码的话,或者留着接口,插件效率会更高。 ...
Cr@zyTreE 发表于 2009-6-19 17:31
目前主要的问题在于更新得分和排名。
现在我采用的方式是,
取出(SELECT)数据库所有的数据(很夸张的做法)并计算得分(按得分排列),然后保存(UPDATE)到Client表的Score项,同时保存Rank
这么做明显会造成内存爆掉。都怪我当初数据库没学好啊~
谁能帮我解决这个问题的话,就不卡了。
表的设计如下(带下划线的为主键)
BombStats(Md5,Planting,Planted,Explode,Defusing,Defused)
其中Md5为文本,其余均为数字
Client(NickName,Password,Md5,LastIPAddress,Rank,LastRank,Score,OnlineTime,RegisterDateTime,LastOnlineDateTime)
其中
NickName,Password,Md5,LastIPAddress为文本
Rank,LastRank,Score为数字
RegisterDateTime,LastOnlineDateTime为日期/时间
RoundStats(Md5,T,CT,S,WinT,WinCT,FirstKill,FirstDeath,LastKill,LastDeath)
其中Md5为32位文本,其余均为数字
WeaponStats(Md5,WeaponID,Kill,Death,HeadShot,HeadShoted,TeamKill,Shot,Hit,Damage)
其中Md5为32位文本,其余均为数字
因为是根据得分Score计算排名的,所以要先计算得分
通过这个select查询可以查出得分
SELECT
C.Md5 AS Md5,
(Sum(WS.Kill)*1-Sum(WS.Death)*0.2+Sum(WS.HeadShot)*1+RS.FirstKill*3+BS.Explode*3+BS.Defused*5+C.OnlineTime/1000) AS Score
FROM Client AS C, WeaponStats AS WS, RoundStats AS RS, BombStats AS BS
GROUP BY C.NickName, RS.FirstKill, BS.Explode, BS.Defused, C.OnlineTime, C.Md5, WS.Md5, RS.Md5, BS.Md5
HAVING C.Md5=WS.Md5 AND C.Md5=RS.Md5 AND C.Md5=BS.Md5
ORDER BY (Sum(WS.Kill)*1-Sum(WS.Death)*0.2+Sum(WS.HeadShot)*1+RS.FirstKill*3+BS.Explode*3+BS.Defused*5+C.OnlineTime/1000) DESC;
我的需求是
因为数据量很大,所以我希望能有最快的算法可以
1.计算得分并update到Client表里的Score
2.根据得分由高到低进行排名,并update到Client表里的Rank
因为我是通过ADO模块对access文件进行操作的,
所以希望能分别用1句update语句实现(或者告诉我怎么在ADO模块里面实现就可以了)
|
|