簡體   English   中英

PHP / SQL-以遞歸方式減少有關大量和最大配額的SQL值

[英]PHP/SQL - Recursively downing SQL values regarding a huge amount and a max quota

我目前正在使用SVG,JQuery / Ajax,PHP和SQL開發基於Web的瀏覽器游戲,但遇到了問題:

遞歸影響的值:-75(健康點)我的值介於1到50(健康點)之間。

例如(ID |健康點):

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

我想要在SQL中,沒有任何PHP while(),將我的數據從最低的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM