@99-rus

Обновление таблицы в бд данными, которые когда-то были, но теперь отсутствуют — как?

Здравствуйте! Есть товары, которые прилетают по API, их заношу в бд, но иногда часть товаров отсутствует в API и в бд нужно обнулить остатки. Как это сделать? Мое решение - завести новое поле типа ENUM со значениями: ('Y','N','NN') - где Y - обновлено по API, N - по умолчанию для всех товаров, NN - было когда-то обновлено, но т.к. товар этот по API не пришел ставим NN. Хотя чувствую что бред какой-то, потому что мне по сути то и не нужно доп. поле, мне всего лишь нужно у тех товаров, которые когда-то были обновлены в бд по API, но которые при следующем обновлении по API вдруг отсутствуют в этом API - просто поставить 0.
P.S. делаю запрос в бд, вытаскиваю товары которые есть в API и пытаюсь искать в массиве вытащенных товаров - товары, которых нет в API через in_array, но что-то фигня какая-то получается, находит один единственный товар, который есть и в API и в бд...
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
делаю запрос в бд, вытаскиваю товары которые есть в API и пытаюсь искать в массиве вытащенных товаров - товары, которых нет в API через in_array,
Для этого есть not in, перечисляете айдишники/уникальные идентификаторы всех пришедших с апи товаров, и у оставшихся ставите наличие 0 одним апдейтом.

но что-то фигня какая-то получается, находит один единственный товар, который есть и в API и в бд
По описанию вообще не ясно как вы ищете совпадающие товары, по этому есть мысль что проблема скорее в коде и алгоритме, чем в апи или базе.
Ответ написан
@Akina
Сетевой и системный админ, SQL-программист.
Есть товары, которые прилетают по API, их заношу в бд, но иногда часть товаров отсутствует в API и в бд нужно обнулить остатки.

Элементарно.

То, что приходит по API, нужно не пихать сразу в рабочую таблицу, а сохранить во временную таблицу. А потом обновить рабочую таблицу, используя полученные данные как источник данных. Потребуется два запроса - первый обновит записи о товарах, имеющихся в пришедшем списке, и добавит новые (INSERT .. SELECT .. ODKU), второй поставит требуемую пометку в нужном поле (UPDATE .. FROM .. LEFT JOIN .. WHERE .. IS NULL).

Альтернативный вариант - добавить в таблицу (если не имеется, что было бы весьма странно для описываемой системы) поле штампа времени обновления записи (updated_at). Перед обновлением по данным API зафиксировать время начала процесса (получить запросом с сервера MySQL), после чего вторым запросом поставить соотв. пометку в те записи, где этот штамп времени ранее запомненного.
Ответ написан
Ваш ответ на вопрос

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

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