Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用一条语句更新MySql表中具有子类别的列组_Mysql_Sql Update_Rank - Fatal编程技术网

使用一条语句更新MySql表中具有子类别的列组

使用一条语句更新MySql表中具有子类别的列组,mysql,sql-update,rank,Mysql,Sql Update,Rank,我有一张叫做“带字段的时间”的表 MapID | Type | Style | PlayerID | Time | Points 次数较少的玩家必须比次数较多的玩家获得更多的积分。基本上,如果我有两个玩家ID: PlayerID 3的时间为10.1秒,PlayerID 4的时间为10.3秒,PlayerID 3得2分,PlayerID 4得1分,因为PlayerID 3的时间更差。如果有4名球员,那么获得第一名的球员将得到4分,下一次排名靠前的球员的得分将下降1分。这基本上都是反向排列,从某种

我有一张叫做“带字段的时间”的表

MapID | Type | Style | PlayerID | Time | Points
次数较少的玩家必须比次数较多的玩家获得更多的积分。基本上,如果我有两个玩家ID: PlayerID 3的时间为10.1秒,PlayerID 4的时间为10.3秒,PlayerID 3得2分,PlayerID 4得1分,因为PlayerID 3的时间更差。如果有4名球员,那么获得第一名的球员将得到4分,下一次排名靠前的球员的得分将下降1分。这基本上都是反向排列,从某种意义上说,最上面的时间获得最高的排名,而不是排名1

所有这些都必须在一个语句中的原因是,在我创建程序的语言中,Sourcepawn不允许使用分隔符;查询。我之所以提到子类别,是因为MapID、类型和样式的每个组合都是它自己的子类别

下面是一张更容易解释我的问题的图片: 我只想根据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

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

SQLite的解决方案是什么?我确信可以修改它以使用MySQL.UPDATE times SET Points=SELECT t1.Rank FROM SELECT t1.ROWID,count AS Rank FROM times AS t1,times AS t2其中t1.MapID=t2.MapID=%d和t1.Type=t2.Type和t1.Type=%d和t1.Style=t2.Style和t1.Style=%d和t1.Time好的,现在我修改了它,所以每次它说ROWID,它就说id,我必须把count改为count*。现在我遇到了一个奇怪的问题,只有在我直接从控制面板手动发出查询时,查询才会起作用。如果我通过我的程序来做,它会说:没有这样的列:t1.id。我确信这是我第一篇帖子中第五行的问题。但是如果我在同一个语句中将times声明为t1,那么这不应该起作用吗?那么您的程序中有一个bug,或者您正在使用不同的数据库。谢谢,这就是问题所在。我不小心用错了数据库。我忘了将连接方法从SQLite更改为MySQL。现在问题已经解决了。如果你接受这个答案,其他人就会知道问题已经解决了,因此不需要进一步的帮助。MySQL中的自动增量列足以替代SQLite中的隐式ROWID列,因此如果他们遇到类似问题,他们可以尝试此解决方案。