2013-03-04 51 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;