簡體   English   中英

獲取並更新表中所有行的列

[英]Get and update column of all rows in a table

我正在開發游戲,我希望腳本每分鍾運行一次(我想是在cron job的幫助下)。

因此,我要運行的腳本采用字符的最大HP(從數據庫表中的列),計算得出該值的10%,然后將這些10%添加到當前hp的字符中(這是該表中的另一列)桌子)。 然后,我想遍歷數據庫表中的所有行。

例如考慮下表:

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)
        ));
    }
}

我唯一的問題是:以上發布的解決方案是否是實現此目標的有效方法? 這將在具有10000行的表上工作還是會花費太長時間?

提前致謝。

在一個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

您正在使用SQL數據庫嗎? 如果您有10,000行,您的解決方案將命中數據庫10,000次。 這樣的SQL語句只會使一個數據庫命中:

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

數據庫仍將必須執行更新所有10,000行所必需的I / O,但與成千上萬的單個查詢相比,它的執行效率更高。

暫無
暫無

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

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