我想在Mysql中编写一个函数,从给定的产品代码返回一个格式化的字符串
以下是我现在需要手动制作的调用示例,以获得我想要的结果。
SELECT p.productcategoryid from products p where (isnull(p.endeffdt) or (p.endeffdt = '0000-00-00') or (p.endeffdt > now())) and p.code='T29R66N1';
T29R66NQ是我需要完整路径的产品代码 - 上面的调用返回'38'作为类别ID。
然后我根据上面的结果执行以下选择
SELECT name,parentid,productcategorypath FROM productcategory WHERE recid = '38';
返回
name->内置式滚刀
parentid-大于7
productcategorypath = 222,7,38
然后使用该结果
SELECT name,parentid,productcategorypath FROM productcategory WHERE recid = '7';
给我
名称 - >内置
parentid-> 222个
productcategorypath = 222,7
然后,我再做
SELECT name,parentid,productcategorypath FROM productcategory WHERE recid = '222';
反过来给了我
name-> Kitchen&家用电器
parentid-大于0
productcategorypath = 222
我停在那里因为parentid = 0(它可以继续进行更多迭代,但总是以父ID为0结束)但是我需要最后3个选择的结果给我以下字符串
Kitchen & Home Appliances > Built-In > Built-In Hobs
我想要一个mysql函数,我可以像
一样使用它select getpath(code) from products where code='T29R66N1'
任何帮助都将不胜感激。
编辑:
我自己设法 - 这是我的功能
DROP FUNCTION如果存在mydb.getpath;
创建功能mydb.getpath(itemid VARCHAR(20))
RETURNS varchar(255)
BEGIN
DECLARE path_name varchar(255);
DECLARE tmp_name varchar(255);
DECLARE tmp_parentid INT;
DECLARE tmp_parentid1 INT;SELECT p.productcategoryid INTO tmp_parentid from products p where(isnull(p.endeffdt)or(p.endeffdt ='0000-00-00')or(p.endeffdt> now()))和p.code = itemid的;
myloop:LOOP
SELECT name,parentid INTO tmp_name,tmp_parentid1 FROM productcategory WHERE recid = tmp_parentid;
SET path_name = concat_ws('>',tmp_name,path_name);
如果tmp_parentid1!= 0那么 SET tmp_parentid = tmp_parentid1;
ITERATE myloop;
ELSE
离开myloop;
万一;
结束循环;
RETURN path_name;
END;
答案 0 :(得分:0)
DROP FUNCTION IF EXISTS mydb.getpath;
CREATE FUNCTION mydb.getpath (itemid VARCHAR(20))
RETURNS varchar(255)
BEGIN
DECLARE path_name varchar(255);
DECLARE tmp_name varchar(255);
DECLARE tmp_parentid INT;
DECLARE tmp_parentid1 INT;
SELECT p.productcategoryid INTO tmp_parentid from products p where (isnull(p.endeffdt) or (p.endeffdt = '0000-00-00') or (p.endeffdt > now())) and p.code=itemid;
myloop:LOOP
SELECT name,parentid INTO tmp_name,tmp_parentid1 FROM productcategory WHERE recid = tmp_parentid;
SET path_name = concat_ws(' > ', tmp_name,path_name);
IF tmp_parentid1!=0 THEN
SET tmp_parentid = tmp_parentid1;
ITERATE myloop;
ELSE
LEAVE myloop;
END IF;
END LOOP;
RETURN path_name;
END;