【发布时间】:2013-06-03 08:44:34
【问题描述】:
我有一个名为 times 的表,其中包含字段
MapID | Type | Style | PlayerID | Time | Points
低于次(时间)的玩家(PlayerID)必须比高于次的玩家拥有更多的积分。基本上,如果我有两个 PlayerID: PlayerID 3 的时间为 10.1 秒,PlayerID 4 的时间为 10.3 秒,PlayerID 3 将获得 2 分,而 PlayerID 4 将获得 1 分,因为 PlayerID 3 的时间更差。如果有 4 个 PlayerID,那么获得第 1 名的玩家将获得 4 分,并且在下一个最高时间得分会减少 1。这基本上都是反向排名,在某种意义上,排名靠前的时间排名最高,而不是排名第一。
这一切都必须在一个语句中的原因是因为在我创建程序的语言中是 Sourcepawn,它不允许使用分隔符 (;) 进行查询。而我之所以提到子类别,是因为 MapID、Type、Style 的每一个组合都是它自己的子类别。
这是一张更容易解释我的问题的图片:http://i.imgur.com/W8d90P4.png 我只想根据 MapID、Type、Style 和 Time order 对点进行分类 在使用 SQLite 之前,我确实想出了一个解决方案:
UPDATE times
SET Points = (
SELECT t1.Rank
FROM (
SELECT t1.id, count(*) AS Rank
FROM times AS t1, times AS t2
WHERE t1.MapID=t2.MapID
AND t1.MapID=%d
AND t1.Type=t2.Type
AND t1.Type=%d
AND t1.Style=t2.Style
AND t1.Style=%d
AND t1.Time <= t2.Time
GROUP BY t1.PlayerID
ORDER BY t1.Time
) AS t1
WHERE t1.id=times.id
)
WHERE MapID=%d AND Type=%d AND Style=%d
【问题讨论】:
-
SQLite 的解决方案是什么?我确信它可以修改为与 MySQL 一起使用。
-
"UPDATE times SET Points=(SELECT t1.Rank FROM (SELECT t1.ROWID, count() AS Rank FROM times AS t1, times AS t2 WHERE t1.MapID=t2.MapID AND t1. MapID=%d AND t1.Type=t2.Type AND t1.Type=%d AND t1.Style=t2.Style AND t1.Style=%d AND t1.Time
标签: mysql sql-update rank