2015-03-23 2 views
0

Я разрабатываю игру, и я хочу, чтобы скрипт запускался каждую минуту (с помощью задания 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

Я думаю, что следующий оператор SQL выполняет вычисления для вас: 'update characters set current_hp = max (current_hp + max_hp/10);' –

+1

Как проигрывались игроки с 15 до 19? 10% из 64 - 6,4, поэтому можно было бы представить, что 15 станет 21, или, может быть, даже 22. – eggyal

+0

@eggyal Да, это было просто я неряшливый ... lol, спасибо. –

ответ

0

Вы используете базу данных SQL? Если у вас 10 000 строк, ваше решение попадет в базу данных 10 000 раз. SQL-оператор, как это будет только сделать хит один базы данных:

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

База данных будет все равно придется делать ввода/вывода, необходимых для обновления всех 10000 строк, но это будет более эффективно, чем тысячи индивидуальных запросов.

+0

Отлично, я попробую! Огромное спасибо! –

0

В одном операторе 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 
+0

Отлично, я попробую! Огромное спасибо! –