2013-03-04 56 views
0

我想在MySQL中编写一个函数,从给定的产品代码返回一个格式化字符串的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(它可以继续用于多次迭代,但总是以0父ID结束),但我需要的结果从最后3个选择至给我下面的字符串

Kitchen & Home Appliances > Built-In > Built-In Hobs 

我想一个MySQL功能,由此我可以用它像

select getpath(code) from products where code='T29R66N1' 

任何帮助,将不胜感激。

编辑:

我设法弄清楚它自己 - 这是我的功能

DROP FUNCTION IF EXISTS mydb.getpath;

CREATE FUNCTION mydb。的getPath(为itemid VARCHAR(20))

RETURNS VARCHAR(255)

BEGIN

DECLARE路径名的varchar(255);
DECLARE tmp_name varchar(255);
DECLARE tmp_parentid INT;
DECLARE tmp_parentid1 INT;

从产品p中选择p.productcategoryid INTO tmp_parentid其中(isnull(p.endeffdt)或(p.endeffdt ='0000-00-00')或(p.endeffdt> now()))和pCode =的itemid;

myloop:LOOP

SELECT姓名,parentId的INTO tmp_name的值,tmp_parentid1 FROM产品分类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;

+0

您正在使用的结构被称为*邻接表*。这里有一个参考,让你开始:http://ulaptech.blogspot.ca/2010/05/retrieving-data-hierarchies-on-sql.html – dnagirl 2013-03-04 14:50:01

+0

感谢@dnagirl的评论:-) – l0ckm4 2013-03-04 16:01:43

回答

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;