获取并更新表中所有行的列

时间:2015-03-23 19:11:58

标签: php mysql

我正在开发游戏,我希望每分钟运行一个脚本(在cron作业的帮助下,我猜)。

因此,我想要运行的脚本获取字符的最大HP(来自数据库表中的列),计算得到该值的10%,然后将这10%添加到当前hp的字符(这是表中的另一栏)。然后我想在数据库表中的所有行上进行迭代。

E.g。请考虑下表:

charname      current_hp      max_hp
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
player1               20          30
player2               15          64
player3               38          38

运行脚本后,我希望表格如下所示:

charname      current_hp      max_hp
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
player1               23          30
player2               21          64
player3               38          38

所以,我知道我在技术上如何实现这一点,例如

$characters = $db->getCharacterList();

foreach ($characters as $character) {
    $maxHp = $character['max_hp'];
    $curHp = $character['current_hp'];
    $hpToAdd = $maxHp / 10;

    if (($curHp + $hpToAdd) >= $maxHp) {
        $db->update('characters', $character['id'], array(
            'current_hp' => $maxHp
        ));
    } else {
        $db->update('characters', $character['id'], array(
            'current_hp' => ($curHp + $hpToAdd)
        ));
    }
}

我唯一的问题是:上面的解决方案是否有效实施此方法?这会在10 000行的桌子上工作,还是花费太长时间?

提前致谢。

2 个答案:

答案 0 :(得分:0)

In One SQL语句将满足您对更高性能的所有要求,删除此表上的任何索引以保持其快速

UPDATE test
SET current_hp= CASE
WHEN ((max_hp/10)+current_hp) >=max_hp THEN max_hp
ELSE  ((max_hp/10)+current_hp)
END

答案 1 :(得分:0)

您使用的是SQL数据库吗?如果您有10,000行,那么您的解决方案将在数据库中运行10,000次。像这样的SQL语句只会使一个数据库命中:

UPDATE characters
SET current_hp = LEAST(max_hp, current_hp + (max_hp / 10))

数据库仍然需要执行更新所有10,000行所需的I / O,但它将比数千个单独查询更有效。