在更新中使用逻辑并使用尽可能少的查询返回更新的字段

时间:2012-06-29 15:45:26

标签: mysql

我正在一个服务器上用javascript编写一个视频游戏,将信息保存在一个mysql数据库中,我试图让我的第一个效果附加到简单的治疗药水项目。为了实现这个效果,我使用spell_id调用一个法术表,它得到一个名为effect的字段,其中包含要在我的服务器上执行的代码。我使用eval()函数来执行字符串中的代码。为了优化游戏,我希望尽可能少地运行查询。对于这个例子(我认为答案将帮助我评估其他类似的效果)我想更新'播放器'表,其中包含像'health'这样的stat列,然后我希望它添加n,这将是一个递减的数字15然后250毫秒之后加14然后13直到n = 1净效果是健康的大幅度跳跃然后越来越小实现这一点相对容易如果玩家的健康达到他的最大允许限制,效果将立即停止... 但是我想为每次增加做一个单独的更新声明,而不是每隔250ms进行一次选择和更新,以检查健康状况> max_health并确保玩家的健康状况不超过他的最大生命值。所以,为了离题,我想要一个给出这个数据的单一更新

player_id   health   max_health
=========   ======   ==========
1           90       100

除非(max_health-health)< 15 ...在这种情况下,它应该只增加10。

更简单的解决方案可能是 如果我可以在每次更新后返回健康状况和最大健康状况,我会更新它,我不介意做最后的决定 伪代码 如果健康> max_health 更新健康设置健康=最大健康

因此,如果有人能够解释如何在更新之后返回字段,那将有所帮助。 或者,如果有人能够展示如何在更新中使用逻辑,这也会有所帮助。

另外,如果我没有提供足够的信息,我很抱歉,我很乐意提供更多信息,我只是不想让这个问题难以理解。

2 个答案:

答案 0 :(得分:2)

update health
set health = least(max_health, health +<potion effect>)
where player_id = ...

修改

对于您的其他问题:通常,我认为更新会返回受影响的行数。因此,如果您在健康状况已经= max_health时尝试更新健康状况,则应该返回0。

我知道如何在php中执行此操作,例如,但只是说你在哪里使用javascript ...所以?

http://dev.mysql.com/doc/refman/5.6/en/update.html

  

UPDATE返回实际更改的行数。该   mysql_info()C API函数返回的行数   匹配和更新以及在此期间发生的警告数   更新。

答案 1 :(得分:0)

使用ANSI标准CASE函数或mysql only least函数,如另一个答案

UPDATE player
SET health = CASE WHEN health + [potion] > max_health 
             THEN max_health  
             ELSE health + [potion] 
             END CASE
WHERE player_id = [player_id]