第一种方法
show variables like '%func%';
set global log_bin_trust_function_creators=1;
DELIMITER $$
CREATE FUNCTION `getByDown`(id INT) RETURNS varchar(6000) CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR(6000);
DECLARE sTempChd VARCHAR(6000);
SET sTemp='$';
SET sTempChd = CAST(id AS CHAR);
WHILE sTempChd IS NOT NULL DO
SET sTemp= CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(id) INTO sTempChd FROM sys_permission
WHERE FIND_IN_SET(parent_id,sTempChd)>0;
END WHILE;
RETURN sTemp;
END$$
DELIMITER ;
DELIMITER $$
CREATE FUNCTION `getpermsByUp`(id INT) RETURNS varchar(4000) CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);
SET sTemp='$';
SET sTempChd = CAST(id AS CHAR);
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT parent_id INTO sTempChd FROM sys_permission WHERE id = sTempChd;
WHILE sTempChd <> 0 DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT parent_id INTO sTempChd FROM sys_permission WHERE id = sTempChd;
END WHILE;
RETURN sTemp;
END$$
DELIMITER ;
第二种方法
通过 with as语法来实现递归(WITH RECURSIVE AS)
WITH RECURSIVE temp AS (
SELECT * FROM sys_resource r WHERE r.resource_id =1200
UNION ALL
SELECT r.* FROM sys_resource r,temp t WHERE t.resource_id = r.parent_id
)select * from temp
WITH RECURSIVE temp AS (
SELECT * FROM sys_resource r WHERE r.resource_id =1210
UNION ALL
SELECT r.* FROM sys_resource r,temp t WHERE t.parent_id = r.resource_id
)select * from temp