我有一个名为 times 的表,其中包含字段
MapID | Type | Style | PlayerID | Time | Points
时间 (Time)较低的玩家 (PlayerID)必须比时间较高的玩家拥有更多积分。基本上,如果我有两个 PlayerID:PlayerID 3 的时间为 10.1 秒,PlayerID 4 的时间为 10.3 秒,PlayerID 3 将获得 2 分,而 PlayerID 4 将获得 1 分,因为 PlayerID 3 的时间更糟。如果有 4 个 PlayerID,那么获得第 1 名的玩家将获得 4 分,并且在下一个最高时间得分会减少 1。这基本上都是反向排名,最高时间在某种意义上获得最高排名,而不是排名 1。
这一切都必须在一个语句中的原因是因为在我创建程序的语言中是 Sourcepawn,它不允许使用分隔符 (;) 进行查询。我提到子类别的原因是 MapID、Type、Style 的每个组合都是它自己的子类别。
这是一个更容易解释我的问题的图像:http: //i.imgur.com/W8d90P4.png 我只想根据 MapID、类型、样式和时间排序这样的点我确实想出了一个解决方案在此之前使用 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