У меня имеется следующая таблица:
CREATE TABLE IF NOT EXISTS `farmers` (
`id` INT(11) AUTO_INCREMENT COMMENT 'ID записи',
`user_id` bigint NOT NULL COMMENT 'ID юзера',
...
`energy` INT(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Энергия'
`apples_need` INT(11) UNSIGNED DEFAULT 1 COMMENT 'Сколько нужно яблок в день',
`apples` INT(11) UNSIGNED DEFAULT 0 COMMENT 'Яблок нафармлено за день',
...
PRIMARY KEY (`id`),
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
Теперь, хочу реализовать скрипт, который будет выполняться раз в сутки, в 00:00 через Cron. Суть скрипта следующая и выполнение должно быть разделено на части.
Первая часть
farmers, у которых apples <= apples_need;apples.Вторая часть
farmers, у которых apples > apples_need;apples = 5), а ему в сутки нужно добыть 5 (apples_need = 5), то вычислить остаток (лишнее кол-во) и конвертировать следующим образом:
Прибавить лишнее кол-во apples к полю energy;apples.На словах всё выглядит громоздко, на самом деле, мне кажется, что можно сделать проще. Проблема в том, что не знаю, как правильно построить запросы такого типа, и так, чтобы это создавало как можно меньше загрузки. Поэтому, хотелось бы увидеть пример реализации сих слов. Скрипт будет работать на большое число юзеров.
Заранее спасибо.
Возможно, так:
update farmers
set energy = energy + case when apples > apples_need then apples - apples_need else 0 end,
apples = 0;
Сборка персонального компьютера от Artline: умный выбор для современных пользователей