UPDATE具有一个语句的子类别的MySql表中的排名

时间:2013-06-03 08:44:34

标签: mysql sql-update rank

我有一个名为times with fields

的表
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个玩家ID,则具有第一名时间的玩家将获得4分,并且下一个最高时间点数将下降1。这只是基本上反向排名,其中顶级时间在某种意义上而不是排名1中获得最高排名。

这一切必须在一个声明中的原因是因为在我创建我的程序的语言中是Sourcepawn,它不允许查询的分隔符(;)。我提到子类别的原因是MapID,Type,Style的每个组合都是它自己的子类别。

这是一张更容易解释我的问题的图片:http://i.imgur.com/W8d90P4.png 我只想根据MapID,Type,Style和Time命令对这些点进行分类 在使用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

1 个答案:

答案 0 :(得分:0)

在表格中添加AUTO_INCREMENT列。该列可以扮演SQLite数据库中隐式ROWID列的角色。