php - 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 行,我担心这不是最好的方法。
解决方案
您似乎想要累积和和减法。一种方法使用变量:
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;
推荐阅读
- reactjs - React dnd 使用自定义拖动层重新渲染太多,react.memo
- r - 如何打印函数的计算方法
- c++ - 将 2d 数组初始化为初始化列表 C++ 中的一个值
- ruby-on-rails - 如何使用 @rails/webpacker 加载本地字体?
- file - 如何在 Haskell 中反复读取大数据文件的洗牌行?
- dataframe - PySpark Filter between - 根据组提供上限和下限列表
- java - 从活动中访问片段方法中的方法
- ssh - 以编程方式从 SFTP 服务器下载千兆字节文件的有效方法
- javascript - 如何仅更改 onClick 函数的单个 div 以显示更多信息?
- java - 使用另一个事件侦听器从多个私有内部类中提取值