Массовое получение и обновление SQL

152
28 апреля 2018, 16:44

У меня имеется следующая таблица:

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. Суть скрипта следующая и выполнение должно быть разделено на части.

Первая часть

  1. Получить всех из таблицы farmers, у которых apples <= apples_need;
  2. Обнуляем счётчик apples.

Вторая часть

  1. Получить всех из таблицы farmers, у которых apples > apples_need;
  2. Посчитать остаток яблок. То есть, если у фермера 10 яблок (apples = 5), а ему в сутки нужно добыть 5 (apples_need = 5), то вычислить остаток (лишнее кол-во) и конвертировать следующим образом: Прибавить лишнее кол-во apples к полю energy;
  3. Обнулить счётчик apples.

На словах всё выглядит громоздко, на самом деле, мне кажется, что можно сделать проще. Проблема в том, что не знаю, как правильно построить запросы такого типа, и так, чтобы это создавало как можно меньше загрузки. Поэтому, хотелось бы увидеть пример реализации сих слов. Скрипт будет работать на большое число юзеров.

Заранее спасибо.

Answer 1

Возможно, так:

update farmers
set energy = energy + case when apples > apples_need then apples - apples_need else 0 end,
apples = 0;
READ ALSO
curl ничего не возвращает

curl ничего не возвращает

На сервере (Windows 2012) стоит Apache + PHPПытаюсь подключится к Qiwi API по curl

138
Можно ли у разделов в кастомайзере сделать подразделы (Wordpress)

Можно ли у разделов в кастомайзере сделать подразделы (Wordpress)

Можно ли у разделов в кастомайзере сделать подразделы?

140