商品的sku本来应该是独立的,唯一的,
比如链子的sku是L001,L002,L003这样的,吊坠的是D001,D002,D003这样的,
可是由于历史原因,有些产品组合起来销售,它们的sku是别的sku组合起来的,
比如链子+吊坠的:L001+D002这样的,
可是统计的时候又要按独立的sku,那就要把订单拆分插入表中,
比如一个订单的sku是L001+D002,就要拆分为2行,每行的sku分别是L001和D002
下面先在mysql里面创建一个存储过程,用于把一条组合产品的记录拆分为2条插入数据库:
DELIMITER $$
USE `aporroreport`$$
DROP PROCEDURE IF EXISTS `sku_split_insert_order`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sku_split_insert_order`(sku VARCHAR(255), orderid INT)
BEGIN
DECLARE sku_num INT; #该Sku里面实际上包含多个sku, 通过+分隔,这里只计算+的数量
DECLARE sku_i INT; #临时变量
DECLARE tmp_sku VARCHAR(255); #临时拆分出来的sku
DELETE FROM `sku_orders_products_list`; #先清空表
#本来正确的sku_num应该是+1,但这里因为下标从1开始,所以+2
SET sku_num = LENGTH(sku) - LENGTH(REPLACE(sku,'+',''))+2;
SET sku_i = 1;
WHILE sku_i < sku_num DO
#一段一段地截取sku
SET tmp_sku = SUBSTRING_INDEX(SUBSTRING_INDEX(sku,'+',sku_i),'+',-1);
#插入表
INSERT INTO `sku_orders_products_list`(sku,orderid) VALUES(tmp_sku, orderid);
SET sku_i = sku_i + 1;
END WHILE;
END$$
DELIMITER ;
执行
CALL sku_split_insert_order('L001+D002', 888)
结果:
最后的存储过程:
DELIMITER $$
USE `aporroreport`$$
DROP PROCEDURE IF EXISTS `test_copy_order`$$
CREATE PROCEDURE `test_copy_order`()
BEGIN
#把一个订单表的数据转到另一个表中,因为其中的sku实际上是由多个sku加起来的,现在要拆分
#即:2个sku组合的拆分为2行,3个sku组合的拆分为3行
#--定义接收游标数据的变量
DECLARE sku VARCHAR(200); #临时的sku
DECLARE sku_num INT; #该Sku里面实际上包含多个sku, 通过+分隔,这里计算独立的sku的数量
DECLARE sku_i INT; #临时变量
DECLARE tmp_sku VARCHAR(255); #临时拆分出来的sku
DECLARE orderid INT;
#-- 游标
#-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
#查询的时候要加别名,否则查不到数据
DECLARE cur CURSOR FOR SELECT t.sku, t.orderid FROM `aporro_orders_products_list` AS t ;
#-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
#-- 打开游标
OPEN cur;
#-- 开始循环
read_loop:LOOP
#-- 提取游标里的数据
FETCH cur INTO sku,orderid;
#-- 声明结束的时候
IF done THEN
LEAVE read_loop;
END IF;
#统计独立的sku数量,本来正确的sku_num应该是+1,但这里因为SUBSTRING_INDEX下标从1开始,所以+2
SET sku_num = LENGTH(sku) - LENGTH(REPLACE(sku,'+',''))+2;
SET sku_i = 1;
WHILE sku_i < sku_num DO
#一段一段地截取sku
SET tmp_sku = SUBSTRING_INDEX(SUBSTRING_INDEX(sku,'+',sku_i),'+',-1);
#插入另一个表,这个表里sku都不带加号了
INSERT INTO `sku_orders_products_list`(sku,orderid) VALUES(tmp_sku, orderid);
#取下一段sku
SET sku_i = sku_i + 1;
END WHILE;
END LOOP;
#-- 关闭游标
CLOSE cur;
END$$
DELIMITER ;