前段时间接到项目经理的一个需求,要对之前的做的电商平台的发布商品的规格写一个sql语句,调用sql可以实现调用sql对该商品品进行规格补充,
背景:规格数值分两张表存放,这简称key表和value表,用于存放去重之后的具体值,style表存放商品规格的匹配表。表结构如下:
key表
名 | 类型 |
---|---|
keyid | varchar(32) |
keyzhi | varchar(64) |
goodsid | bigint |
value表
名 | 类型 |
---|---|
valueid | varchar(32) |
valuezhi | varchar(64) |
goodsid | bigint |
style表
名 | 类型 |
---|---|
styleid | bigint |
key1 | varchar(32) |
value1 | varchar(64) |
key2 | varchar(32) |
value2 | varchar(64) |
goodsid | bigint |
key表
14bab4d589204114ac9f5941e6480288 颜色 70
b151377d976744a59e4e8dc140fcc2bf 尺寸 70
value表
1d4429a88613484792196bade689773e 小米9SE 14bab4d589204114ac9f5941e6480288 70
2cc77f0e413449de837741c75ff32362 电光紫 b151377d976744a59e4e8dc140fcc2bf 70
4bff49f25b5d11e98fff00163e007b2d HuaWei P30 14bab4d589204114ac9f5941e6480288 70
5b1c03085b5d11e98fff00163e007b2d HuaWei P31 14bab4d589204114ac9f5941e6480288 70
7f5e87a83d414127ad2c1af91123ee51 Nokia6 14bab4d589204114ac9f5941e6480288 70
8dcc5463d56b4237907246268bb29157 骚粉色 b151377d976744a59e4e8dc140fcc2bf 70
话不多说直接上语句,边写边解释
delimiter $$
//传入参数,商品id gid BIGINT ,规格名称 k2value VARCHAR
create procedure proc3(gid BIGINT,k2value VARCHAR(64))
begin
/*定义变量 declare [名字] [类型]*/
declare done int default false; /* 用于判断退出循环 */
declare ky1,ky2 VARCHAR(32); /* 用于key表中的两个id */
declare kvalue VARCHAR(64);
declare uid VARCHAR(36); /* 用于存放所需要的uuid */
/* 用于存放所需要循环的结果集的游标 有表数据 骚粉色 电光紫 */
declare colorlistcursor for select gv.valuezhi from g_goodspropertyvalue gv where gv.goodsid=goodsid and gv.keyid = (SELECT keyid from g_goodspropertykey where goodsid = gid and sort = 10);
/* not found时,退出循环 */
declare continue handler for not found set done=true;
/* 给定义的变量赋值
1.set ky1 = 9;
2.select ky1 = 9;
*/
SET ky1 = (SELECT keyid from g_goodspropertykey where goodsid = gid and sort = 10);
SET ky2 = (SELECT keyid from g_goodspropertykey where goodsid = gid and sort = 20);
/*打开游标*/
open cur1;
/*对数据进行循环处理
my_loop是循环的标签,可以用leave离开循环
LOOP
[sql语句块]
end loop; 结束循环
*/
myloop: LOOP
/*取游标结果集中的值给kvalue,每次循环取游标中的下一个,在这里也就是获取我们想要得到的规格中一的颜色集合中的每个颜色*/
fetch colorlist into kvalue;
/*当游标没有数据的时候跳出循环*/
if done then
leave myloop;
end if;
/* 执行插入操作将数据插入到样式表 */
INSERT INTO g_goodsstyles(key1,value1,key2,value2,defaultimg,price,supplyprice,stock,goodsid,businessno) VALUES(ky1,kvalue,ky2,k2value,NULL,NULL,NULL,NULL,gid,NULL);
end loop;
/*在这里顺道介绍一uuid,自增id,生成时理论上空间唯一,具体可以去百度,在这里我需要一个32的且不带-的uuid,所以我在声明时定义的时36位的,目的为了去除4个-*/
SET uid = UUID();/*这时的uid大致为578e3ef2-5e9d-11e9-8fff-00163e007b2d。所以我要去除中间4个-,这里用到replace函数*/
SET uid = REPLACE(uid,'-','');
INSERT into g_goodspropertyvalue(valueid,valuezhi,keyid,sort,goodsid) VALUES(uid,k2value,ky2,0,gid);
close colorlist;
end$$
delimiter ;
代码上述所示,可以直接拷贝使用,去除注释在对应地方放入你自己的数据即可。
注意点:创建存储过程,声明变量,设置变量,使用变量,设置浮标,开启浮标,开启循环块,判断是否需要跳出循环,关闭循环快,关闭浮标,uuid使用