Хранимая процедура для объединения полей в БД - MySQL
Формулировка задачи:
Добрый день.
Есть 3 таблицы:
1. orders
2. products
3. orderItems:
id
idOrder(forein key на таблицу orders)
idProduct(forein key на таблицу products)
productCount
...
Задача.
Нужно объединить позиции двух произвольно выбранных заказов. Чтобы все товары из обоих заказов оказались в первом, причем если товар встречается в обоих заказ - то, разумеется, сумма.
Т.е., напирмер:
А вот с обновлением базы у меня начинаются проблемы. Пробовал результат предыдущей выборки записывать в курсор, а потом по нему проходить и обновлять позиции, но работает некорректно.
Ошибка возникает, если в обоих заказах есть один и тот же товар. В результирующем заказе оказывается и сумма из двух заказов и отдельным полем то, что было во 2 заказе.
Прощу помощи в исправлении хранимки. Заранее спасибо.
заказ 1:
товар 1 - 1 шт. товар 2 - 1 шт.заказ 2:
товар 1 - 1 шт. товар 3 - 1 шт. В результате объединения должно получиться:заказ 1:
товар 1 - 2 шт. товар 2 - 1 шт. товар 3 - 1 шт.заказ 2 - пустой.
Получить необходимый список товаров, который должен оказаться в первом заказе - не проблема, простейший запрос:SELECT oi.Id, oi.productId, SUM(oi.productCount) FROM orderitems oi WHERE oi.OrderId IN (orderId, orderForCombineId) GROUP BY oi.productId;
Хранимая процедура:
CREATE DEFINER = 'database'@'localhost' PROCEDURE `goodwill-store`.combine(IN orderId bigint, IN orderForCombineId bigint) BEGIN DECLARE done int DEFAULT 0; DECLARE orderItemId bigint; DECLARE productID bigint; DECLARE itemCount int; DECLARE cur1 CURSOR FOR SELECT oi.Id, oi.ProductId, SUM(oi.ProductCount) FROM orderitems oi WHERE oi.OrderId IN (orderId, orderForCombineId) GROUP BY oi.ProductId; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN cur1; REPEAT FETCH cur1 INTO orderItemId, productID, itemCount; IF NOT done THEN UPDATE orderitems o SET o.OrderId = orderId, o.ProductCount = itemCount WHERE o.Id = orderItemId; END IF; UNTIL done END REPEAT; CLOSE cur1; END
Решение задачи: «Хранимая процедура для объединения полей в БД»
textual
Листинг программы
UPDATE orderitems a JOIN orderitems b on b.productId=a.productId and b.OrderId = var_orderForCombineId SET a.ProductCount = a.productCount+b.productCount WHERE a.OrderId = var_orderId;
Объяснение кода листинга программы
В представленном коде выполняется обновление записи в таблице orderitems
. Данная операция выполняется с использованием хранимой процедуры.
Вот список действий, которые выполняются в этом коде:
UPDATE orderitems a
- обновление записи в таблицеorderitems
, где переменнаяa
будет представлять эту таблицу в дальнейшем.JOIN orderitems b on b.productId=a.productId and b.OrderId = var_orderForCombineId
- выполнение операции объединения (JOIN) таблицыorderitems
с самой собой, где объединение происходит по полямproductId
иOrderId
. При этом значение переменнойvar_orderForCombineId
используется для указания идентификатора заказа, который будет участвовать в объединении.SET a.ProductCount = a.productCount+b.productCount
- установка значения поляProductCount
в таблицеorderitems
, которое представляет собой сумму значений полейproductCount
из двух строк, участвующих в объединении.WHERE a.OrderId = var_orderId
- установка условия, которое ограничивает обновление только теми строками, где значение поляOrderId
совпадает с значением переменнойvar_orderId
. Пожалуйста, обратите внимание, что представленное объяснение может быть неполным или неточным, поскольку код может содержать дополнительные действия или условия, которые не были упомянуты в данном списке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д