Задать вопрос
@kakisaebalsujit

Как делать обновление таблицы раз в секунду?

Добрый вечер, я пишу некого бота для вконтакте. Ну это не суть важно.
У меня есть две таблицы:

auto1
5d696b986787f961055528.jpeg
score
5d696b8404e6d669240988.jpeg

Мне нужно брать значение из таблицы auto1, умножать их на определенное число и прибавлять к старым значениям таблицы score.

У меня это сделано отдельным скриптом.
$auto1 = $db->query("SELECT * FROM auto1");
while ($row = $auto1->fetch_assoc()) {
    $ins = $row['card'] * "3.75" + $row['cardrack'] * "7.5" + $row['videocardroom'] * "15";
    $id = $row['vk_id'];
    $db->query("UPDATE score SET score = score + $ins WHERE vk_id = $id LIMIT 1");
}
sleep(15);

$auto1 = $db->query("SELECT * FROM auto1");
while ($row = $auto1->fetch_assoc()) {
    $ins = $row['card'] * "3.75" + $row['cardrack'] * "7.5" + $row['videocardroom'] * "15";
    $id = $row['vk_id'];
    $db->query("UPDATE score SET score = score + $ins WHERE vk_id = $id LIMIT 1");
}
sleep(15);

$auto1 = $db->query("SELECT * FROM auto1");
while ($row = $auto1->fetch_assoc()) {
    $ins = $row['card'] * "3.75" + $row['cardrack'] * "7.5" + $row['videocardroom'] * "15";
    $id = $row['vk_id'];
    $db->query("UPDATE score SET score = score + $ins WHERE vk_id = $id LIMIT 1");
}
sleep(15);

$auto1 = $db->query("SELECT * FROM auto1");
while ($row = $auto1->fetch_assoc()) {
    $ins = $row['card'] * "3.75" + $row['cardrack'] * "7.5" + $row['videocardroom'] * "15";
    $id = $row['vk_id'];
    $db->query("UPDATE score SET score = score + $ins WHERE vk_id = $id LIMIT 1");
}
sleep(15);


Но этот скрипт тратит много ресурсов, как можно сделать это более правильно.
Прошу помощи, сам уже не могу придумать)
  • Вопрос задан
  • 178 просмотров
Подписаться 2 Простой 18 комментариев
Решения вопроса 3
Gomonov
@Gomonov
Не обновляйте поле. Добавьте время с которого бы начали обновлять. Получаете разницу в секундах между текущим и тем которое поставили. Ну и по количеству секунд расчитывайте новое значение. При необходимости сохраняйте, обновляя и время начала отсчёта
Ответ написан
Комментировать
erge
@erge
Примус починяю
а почему бы не сделать это все одним апдейтом?
разве в MySQL не работают подзапросы?

UPDATE score sc
  SET score = score + (
                      SELECT card * 3.75 + cardrack * 7.5 + videocardroom * 15
                      FROM auto1 a
                      WHERE a.vk_id = sc.vk_id
                      )
;


PS: кроме того этот апдейт вообще можно из bash скрипта по крону запускать.
Ответ написан
Комментировать
toxa82
@toxa82
Ну примерно так:
while (true) {
    $sql = 'UPDATE `score` AS s, `auto1` AS a
        SET s.score = s.score + (a.`card` * 3.75 + a.`cardrack` * 7.5 + a.`videocardroom` * 15)
        WHERE s.vk_id = a.vk_id'
    $db->query($sql);
    // sleep(1); // Подозреваю что апдейт будет выполнятся больше секунды
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы