CREATE TABLE `baseaddress` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`pid` int(11) DEFAULT NULL
PRIMARY KEY (`id`)
)
//id以下查询
DROP PROCEDURE IF EXISTS proc_baseaddressList;
CREATE PROCEDURE proc_baseaddressList(IN temppid INT,IN ndepth INT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE b INT;
DECLARE cur1 CURSOR FOR SELECT id FROM baseaddress WHERE pid=temppid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
INSERT INTO tmplist VALUES(NULL,temppid,ndepth);
SET @@max_sp_recursion_depth = 10;
OPEN cur1;
FETCH cur1 INTO b;
WHILE done = 0 DO
CALL proc_baseaddressList(b,ndepth+1);
FETCH cur1 INTO b;
END WHILE;
CLOSE cur1;
END;
DROP PROCEDURE IF EXISTS show_baseaddressList;
CREATE PROCEDURE show_baseaddressList(IN temppid INT)
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS tmplist(sno INT PRIMARY KEY AUTO_INCREMENT,
id INT ,depth INT);
DELETE FROM tmplist;
SET @@max_sp_recursion_depth = 10;
CALL proc_baseaddressList(temppid,0);
SELECT baseaddress.* FROM tmplist,baseaddress WHERE tmplist.id=
baseaddress.id;
END
//id向上级查询
DROP FUNCTION IF EXISTS fun_baseaddress_up;
CREATE FUNCTION fun_baseaddress_up(in_menu_id INT) RETURNS VARCHAR(1000) CHARSET utf8
BEGIN
DECLARE resultStr VARCHAR(1000);
DECLARE tempStr VARCHAR(1000);
SET resultStr = '$';
SET tempStr = CAST(in_menu_id AS CHAR);
WHILE tempStr IS NOT NULL DO SET resultStr = CONCAT(resultStr, ',', tempStr);
SELECT GROUP_CONCAT(pid)
INTO tempStr
FROM baseaddress
WHERE pid <> id
AND FIND_IN_SET(id, tempStr) > 0;
END WHILE;
RETURN resultStr order by id;
END
使用方法
call show_baseaddressList(1);
SELECT * FROM baseaddress WHERE FIND_IN_SET(id, fun_baseaddress_up(5))