Как проделать операцию с минимальным количеством запросов к БД

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 товаров), сначала из полученного массива формируем два больших запроса с нужными данными к двум таблицам типа:
Код:
INSERT INTO table (FIELD,FIELD,FIELD) VALUES (FIELD,FIELD,FIELD),(FIELD,FIELD,FIELD),(FIELD,FIELD,FIELD).....
Теперь как обе таблицы заполнены, нужно проставить количество товаров на складах, т.е. нужно циклом бежать по таблице `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 запросов, это убъет сервак.

Посоветуйте как мне правильно разрулить ситуацию.
Заранее благодарен за внимание)
 

hell0w0rd

Продвинутый новичок
Получаем на каждой итерации минимум 3 запроса, максимум 5. Итого при импорте в базу 20000 товаров, в худшем случае нужно сделать 100000 запросов, это убъет сервак
.:confused:
чета ты там выдумываешь
 

WMix

герр M:)ller
Партнер клуба
мне видится всего 3 запроса, insert продуктов, insert into tmp select количество, update wh, tmp.
 

Тугай

Новичок
prods - это по сути поворот prods_wh по складам.

Если сильно захотеть, то можно получить prods одним запросом из prods_wh типа:
PHP:
select a.imei, a.id, b.wh1_count, b.wh2_count
from prods_wh a,
(select  tmp_id, sum(if(wh_id=1,1,0)) as wh1_count,  sum(if(wh_id=2,1,0)) as wh2_count
from prods_wh
group by tmp_id) b
where a.tmp_id=b.tmp_id
и обычно повернутую таблицу никто не хранит, ее каждый раз считают.
 
Сверху