Хранимая процедура для объединения полей в БД - MySQL

Узнай цену своей работы

Формулировка задачи:

Добрый день. Есть 3 таблицы: 1. orders 2. products 3. orderItems: id idOrder(forein key на таблицу orders) idProduct(forein key на таблицу products) productCount ... Задача. Нужно объединить позиции двух произвольно выбранных заказов. Чтобы все товары из обоих заказов оказались в первом, причем если товар встречается в обоих заказ - то, разумеется, сумма. Т.е., напирмер:

заказ 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
Ошибка возникает, если в обоих заказах есть один и тот же товар. В результирующем заказе оказывается и сумма из двух заказов и отдельным полем то, что было во 2 заказе. Прощу помощи в исправлении хранимки. Заранее спасибо.

Решение задачи: «Хранимая процедура для объединения полей в БД»

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. Данная операция выполняется с использованием хранимой процедуры. Вот список действий, которые выполняются в этом коде:

  1. UPDATE orderitems a - обновление записи в таблице orderitems, где переменная a будет представлять эту таблицу в дальнейшем.
  2. JOIN   orderitems b on b.productId=a.productId and b.OrderId = var_orderForCombineId - выполнение операции объединения (JOIN) таблицы orderitems с самой собой, где объединение происходит по полям productId и OrderId. При этом значение переменной var_orderForCombineId используется для указания идентификатора заказа, который будет участвовать в объединении.
  3. SET a.ProductCount = a.productCount+b.productCount - установка значения поля ProductCount в таблице orderitems, которое представляет собой сумму значений полей productCount из двух строк, участвующих в объединении.
  4. WHERE a.OrderId = var_orderId - установка условия, которое ограничивает обновление только теми строками, где значение поля OrderId совпадает с значением переменной var_orderId. Пожалуйста, обратите внимание, что представленное объяснение может быть неполным или неточным, поскольку код может содержать дополнительные действия или условия, которые не были упомянуты в данном списке.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы