Mysql函数 - 不知道从哪里开始

时间:2013-03-04 14:45:16

标签: mysql function cursor

我想在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;

1 个答案:

答案 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;