sanu0074
Новичок
Есть две таблицы в базе данных в одной хранится информация о каждом товаре:
1я `prods_wh` (ид и номера складов и др. данные): id, imei, tmp_id, wh_id...
2я `prods` (вся информация о товаре, общее количество товара на каждом складе, цены, х-ки и т.д): id, imei, wh1_count, wh1_cost, wh2_count, wh2_cost ... ...
т.е. В одной базе (`prods_wh`) лежат все товары, одна строка в ней = один товар (1шт) = один уникальный imei, но tmp_id - у всех одинаковый; В другой базе (`prods`) один товар = один tmp_id, но есть поля wh1_count, wh2_count ... которые соответствуют номеру склада на котором находится товар, т.е wh1_count = количеству строк в таблице `prods_wh` где wh_id = 1 и tmp_id=нужный ид.... соответственно wh2_count = колву строк с wh_id = 2.......
Когда делается импорт товаров в базу (например 20000 товаров), сначала из полученного массива формируем два больших запроса с нужными данными к двум таблицам типа:
Теперь как обе таблицы заполнены, нужно проставить количество товаров на складах, т.е. нужно циклом бежать по таблице `prods_wh` выбирать товары с конкретным tmp_id и считать количество по каждому wh_id и делать соответственный UPDATE запрос таблицы `prods`.... Таких вот запросов будет очень много и это нагрузит сервак.
Было бы хорошо если б как то реализовать подсчет конкретного товара при сборке первого запроса, чтоб не делать повторных INSERT'ов как то запоминать что этот товар (с таким tmp_id) уже будет добавлен, и в случае если он еще раз встречается, делать +1 как конкретному wh[wh_id]_count...
У меня есть вариант, сразу делать много запросов при разборе исходных данных на каждой итерации при переборе смотреть есть ли уже такой товар или нет, и делать действия, но тогда получается чтобы залить один товар, нужно сделать:
- INSERT INTO `prods_wh` .........
- SELECT COUNT FROM `prods` WHERE tmp_id = xxxx
Если результат > 0, то:
- $wh1 = SELECT COUNT FROM `prods_wh` WHERE tmp_id = xxxx AND wh_id=1
- $wh2 = SELECT COUNT FROM `prods_wh` WHERE tmp_id = xxxx AND wh_id=2
- UPDATE `prods` WHERE tmp_id = xxxx SET wh1_count = $wh1, wh2_count = $wh2
Если результат = 0, то:
- INSERT INTO `prods` SET wh[$wh_id]_count = 1
Получаем на каждой итерации минимум 3 запроса, максимум 5. Итого при импорте в базу 20000 товаров, в худшем случае нужно сделать 100000 запросов, это убъет сервак.
Посоветуйте как мне правильно разрулить ситуацию.
Заранее благодарен за внимание)
1я `prods_wh` (ид и номера складов и др. данные): id, imei, tmp_id, wh_id...
2я `prods` (вся информация о товаре, общее количество товара на каждом складе, цены, х-ки и т.д): id, imei, wh1_count, wh1_cost, wh2_count, wh2_cost ... ...
т.е. В одной базе (`prods_wh`) лежат все товары, одна строка в ней = один товар (1шт) = один уникальный imei, но tmp_id - у всех одинаковый; В другой базе (`prods`) один товар = один tmp_id, но есть поля wh1_count, wh2_count ... которые соответствуют номеру склада на котором находится товар, т.е wh1_count = количеству строк в таблице `prods_wh` где wh_id = 1 и tmp_id=нужный ид.... соответственно wh2_count = колву строк с wh_id = 2.......
Когда делается импорт товаров в базу (например 20000 товаров), сначала из полученного массива формируем два больших запроса с нужными данными к двум таблицам типа:
Код:
INSERT INTO table (FIELD,FIELD,FIELD) VALUES (FIELD,FIELD,FIELD),(FIELD,FIELD,FIELD),(FIELD,FIELD,FIELD).....
Было бы хорошо если б как то реализовать подсчет конкретного товара при сборке первого запроса, чтоб не делать повторных INSERT'ов как то запоминать что этот товар (с таким tmp_id) уже будет добавлен, и в случае если он еще раз встречается, делать +1 как конкретному wh[wh_id]_count...
У меня есть вариант, сразу делать много запросов при разборе исходных данных на каждой итерации при переборе смотреть есть ли уже такой товар или нет, и делать действия, но тогда получается чтобы залить один товар, нужно сделать:
- INSERT INTO `prods_wh` .........
- SELECT COUNT FROM `prods` WHERE tmp_id = xxxx
Если результат > 0, то:
- $wh1 = SELECT COUNT FROM `prods_wh` WHERE tmp_id = xxxx AND wh_id=1
- $wh2 = SELECT COUNT FROM `prods_wh` WHERE tmp_id = xxxx AND wh_id=2
- UPDATE `prods` WHERE tmp_id = xxxx SET wh1_count = $wh1, wh2_count = $wh2
Если результат = 0, то:
- INSERT INTO `prods` SET wh[$wh_id]_count = 1
Получаем на каждой итерации минимум 3 запроса, максимум 5. Итого при импорте в базу 20000 товаров, в худшем случае нужно сделать 100000 запросов, это убъет сервак.
Посоветуйте как мне правильно разрулить ситуацию.
Заранее благодарен за внимание)