首页 > 解决方案 > PHP/SQL - 递归地降低关于大量和最大配额的 SQL 值

问题描述

我目前正在使用 SVG、JQuery/Ajax、PHP 和 SQL 开发基于 Web 的浏览器游戏,但遇到了一个问题:

递归影响的值:-75(健康点)我的值介于 1 到 50(健康点)之间。

例如(ID | 健康点):

1 | 50
2 | 1
3 | 25
4 | 4
5 | 16

我希望在没有任何 PHP while() 的 SQL 中,将我的数据从最低 HP 值组织到最高值以获得:

2 | 1
4 | 4
5 | 16
3 | 25
1 | 50

然后,递归地减去值而不进入负值。例子 :

2 | 0 (74 hp to subtract left)
4 | 0 (70 hp to subtract left)
5 | 0 (54 hp to subtract left)
3 | 0 (29 hp to subtract left)
1 | 21 (0 hp to subtract left)

最后一个条件是每个“字符”损失一个“限制器”的 hp。例如,如果我必须为 100 名 1 到 200 马力的玩家减去 2000 马力。“限制器”将为每个角色最大损失 2000 / 100 = 20 hp。但是这个数字必须在每次减去时更新。这意味着,在此示例中,如果 2 名玩家剩余 700 hp,则限制器将为 350。

但我不知道该怎么做。可能吗 ?最简单的方法是做一个简单的 PHP,但有超过 2k 行,我担心这不是最好的方法。

标签: phpmysqlsql

解决方案


您似乎想要累积和和减法。一种方法使用变量:

select t.*, (@sum := @sum + points) as running_sum
from (select t.*
      from t
      order by t.points asc
     ) t cross join
     (select @sum := 0);

然后,您想要与 -75 的差异,例如:

select t.*,
       greatest((@sum := @sum + points) - 75, 0) as your_value
from (select t.*
      from t
      order by t.points asc
     ) t cross join
     (select @sum := 0);

注意:在 MySQL 8+ 中,语法更简洁:

select t.*,
       greatest(sum(points) over (order by points asc) - 75, 0) as your_value
from t;

推荐阅读