【发布时间】:2013-03-04 14:45:16
【问题描述】:
我想在 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';
返回
名称->内置滚刀
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';
这反过来又给了我
名称->厨房和家用电器
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'
任何帮助将不胜感激。
编辑:
我自己弄明白了——这是我的功能
如果存在则删除函数 mydb.getpath;
CREATE FUNCTION mydb.getpath (itemid VARCHAR(20))
返回 varchar(255)
开始
声明路径名 varchar(255);
声明 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:循环
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;
迭代 myloop;
其他
离开我的循环;
万一;
结束循环;返回路径名;
结束;
【问题讨论】:
-
您使用的结构称为邻接表。以下是帮助您入门的参考:ulaptech.blogspot.ca/2010/05/…
-
感谢@dnagirl 的评论 :-)