|
本帖最后由 mwy5ym 于 2009-6-16 11:43 编辑
最近在设计cstrike的一个数据库,在排名(根据玩家得分)上遇到了瓶颈.望网友们协助.
表的设计如下(带下划线的为主键)
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模块里面实现就可以了) |
|