我正在服务器上用javascript编写一款视频游戏,将信息保存在mysql数据库中,我正试图将我的第一个效果附加到简单的治疗药水物品上。为了实现这个效果,我使用spell_id调用了一个拼写表,它得到一个名为effect的字段,其中包含要在我的服务器上执行的代码。我使用eval()函数来执行字符串中的代码。为了优化游戏,我想运行尽可能少的查询。对于这个例子(我认为答案将帮助我评估其他类似的效果)我想要更新‘球员’表,其中包含一个像‘健康’这样的统计列,然后我想要它添加n,这将是一个递减的数字15,然后250毫秒后添加14,然后13,直到n=1的净效果是一个大的健康跳跃,然后越来越小,实现这是相对容易的,如果球员的健康达到他的最大允许限制,效果将立即停止…但我想为每次增加做一个单独的更新语句,而不是select和每250ms更新一次,以检查健康> max_health,并确保玩家的健康不会超过他的最大健康。因此,稍微离题一下,我想对给定这些数据进行一次更新
player_id health max_health
========= ====== ==========
1 90 100
将使健康增加15,除非(max_ health -health) < 15...在这种情况下,它应该只添加10。
一个更简单的解决方案可能是,如果我可以在每次更新后返回健康和最大健康,如果健康> max_health更新健康,设置健康=最大健康,我不介意执行最后的伪代码
因此,如果有人可以解释如何在更新后返回字段,这将是有帮助的。或者,如果有人能展示如何在更新中使用逻辑,这也会有所帮助。
另外,如果我没有提供足够的信息,我很抱歉我会很高兴提供更多的信息,我只是不想让问题变得难以理解。
发布于 2012-06-29 23:50:51
update health
set health = least(max_health, health +<potion effect>)
where player_id = ...
编辑
对于您的另一个问题:通常,我认为update返回受影响的行数。因此,如果您试图更新健康状况,而健康状况已经是= max_health,那么它应该返回0。
例如,我知道如何在php中做到这一点,但我只是告诉你在哪里使用javascript…所以呢?
http://dev.mysql.com/doc/refman/5.6/en/update.html
UPDATE返回实际更改的行数。mysql_info() C API函数返回匹配和更新的行数以及更新期间出现的警告数。
发布于 2012-06-30 00:04:39
使用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]
https://stackoverflow.com/questions/11264901
复制相似问题