MySQL 自定义函数获取一个分类的无限级子分类

本方法不易维护,建议取出数据,在程序中递归,例如 https://javascript.net.cn/article?id=654


代码如下:

delimiter /
DROP FUNCTION IF EXISTS `getChild` /
CREATE FUNCTION `getChild`(rootId INT) 
RETURNS VARCHAR(1000)
BEGIN 
    DECLARE ptemp varchar(1000);
    DECLARE ctemp varchar(1000);
    SET ptemp = '#';
    SET ctemp =cast(rootId as CHAR);
    WHILE ctemp is not null DO
        SET ptemp = concat(ptemp,',',ctemp);
        SELECT group_concat(id) INTO ctemp FROM tp_item_category   
        WHERE FIND_IN_SET(parent_id,ctemp)>0; 
    END WHILE;  
    RETURN ptemp;  
END;

SELECT * FROM tp_item_category WHERE FIND_IN_SET(parent_id, getChild(1))

DECLARE(定义一个临时变量)

DECLARE语句必须用在BEGIN…END语句块中,并且必须出现在DEGIN…END语句块的最前面,即出现在其他语句之前。

DECLARE定义的变量的作用范围仅限于DECLARE语句所在的BEGIN…END块内及嵌套在该块内的其他BEGIN…END块。即是一个形参。


FIND_IN_SET函数

函数定义FIND_IN_SET(str,strlist),其实和in差不多,但这里不能用in,因为要靠这个where来判断循环结束的条件呢。


CAST函数

CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标类型。



函数的创建:

create function 函数名([参数列表]) returns 数据类型
begin
  sql语句;
  return 值;
end;


函数的调用:

-- 无参调用
select myselect3();
-- 传参调用
select myselect5("python");
select * from class where id=myselect5("python");

 

函数的查看:

查看函数创建语句:show create function 函数名;

查看所有函数:show function status [like 'pattern'];


函数的修改:

函数的修改只能修改一些如comment的选项,不能修改内部的sql语句和参数列表。

alter function 函数名 选项;


函数的删除:

drop function 函数名;



参考:

https://www.mysqlzh.com/

https://www.cnblogs.com/progor/p/8871480.html

https://www.cnblogs.com/chywx/p/9420726.html

https://www.jianshu.com/p/f99665266bb1