【问题标题】:UPDATE Ranks in MySql table that has sub-categories with one statementUPDATE Ranks in MySql table that has sub-categories with a statement
【发布时间】: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


【解决方案1】:

AUTO_INCREMENT 列添加到表中。该列可以起到 SQLite 数据库中隐含的ROWID 列的作用。

【讨论】:

  • 好吧,现在我已经修改了它,所以现在每次它说 ROWID 它都说 id,我不得不将 count() 更改为 count(*)。现在我遇到了一个奇怪的问题,只有当我直接从控制面板手动发出查询时,查询才会起作用。如果我通过我的程序执行此操作,它会显示:“没有这样的列:t1.id”。我确信它是我第一篇文章中查询的第 5 行中的那个。但是,如果我在同一个语句中声明时间 AS t1,那不应该有效吗?
  • 那么你的程序有bug或者你使用了不同的数据库。
  • 谢谢,这就是问题所在。我不小心使用了错误的数据库。我忘记将连接方法从 SQLite 更改为 MySQL。现在问题解决了。
  • 如果你接受这个答案,其他人就会知道 1) 问题已经解决,所以不需要进一步的帮助 2) MySQL 中的 AUTO_INCREMENT 列足以替代隐式 ROWID 列SQLite,所以如果他们遇到类似的问题可以尝试这个解决方案。
猜你喜欢
  • 2022-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-27
  • 2022-12-02
  • 2019-09-29
  • 2022-12-26
相关资源
最近更新 更多