-- create TABLE
DROP TABLE IF EXISTS `subTerms`;
CREATE TABLE `subTerms`(
`Id` INT(255) NOT NULL AUTO_INCREMENT,
`termConceptId` varchar(255) DEFAULT '0',
`terms` varchar (255) DEFAULT '0',
PRIMARY KEY (`Id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;
DROP TABLE IF EXISTS `targetConceptId`;
CREATE TABLE `targetConceptId`(
`ConceptId` varchar(255) DEFAULT '0',
PRIMARY KEY (`ConceptId`)
) ENGINE=INNODB DEFAULT CHARSET=UTF8;
=======================================
-- function: traverseOneLayer
-- hierarchy recursive search
DROP FUNCTION IF EXISTS `traverseOneLayer`;
CREATE FUNCTION `traverseOneLayer`(sTempChd TEXT ) -- 函数参数
RETURNS TEXT
BEGIN
DECLARE sTemp VARCHAR(255);
-- DECLARE sTempChd VARCHAR(4000);
DECLARE cur_end INT DEFAULT 0;
-- SELECT sourceId from relationship where FIND_IN_SET(destinationId,sTempChd)>0;
DECLARE cur CURSOR FOR SELECT sourceId from relationship where FIND_IN_SET(destinationId,sTempChd)>0 and typeId='116680003';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET cur_end = 1; -- 游标的select语句无查询结果
OPEN cur; -- 打开游标
--
SET sTempChd='$'; -- 清空
onelayerLoop:LOOP
FETCH cur INTO sTemp; -- 把第一行数据(conceptId)写入变量中,游标也随之指向了记录的第一行
IF cur_end= 1 THEN
LEAVE onelayerLoop; -- 游标循环结束,跳出
END IF;
IF not EXISTS(select * from targetConceptId WHERE conceptId=sTemp) THEN -- 该节点存在表示
INSERT INTO targetConceptId(ConceptId) VALUES(sTemp);
INSERT INTO subterms(termConceptId, terms) select conceptId,term from description WHERE conceptId=sTemp;
SET sTempChd=concat(sTempChd ,',',sTemp); -- 某一层的子节点串入sTempChd,作为下一次输入
END IF;
END LOOP;
--
CLOSE cur;
RETURN sTempChd;
END
===================================================
-- procedure: querySubTerms
DROP PROCEDURE IF EXISTS `querySubTerms`;
CREATE PROCEDURE `querySubTerms`(startId VARCHAR(255)) -- 函数参数
-- ETURNS VARCHAR(4000)
BEGIN
DECLARE i int;
DECLARE sTempChd TEXT;
SET sTempChd =startId; -- cast(rootId as CHAR); 当前的节点 -- SET i=0;
TRUNCATE TABLE subterms; -- 清空结果表
TRUNCATE TABLE targetConceptId;
INSERT INTO targetConceptId(ConceptId) VALUES(startId);
INSERT INTO subterms(termConceptId, terms) select conceptId,term from description WHERE conceptId=startId;
WHILE (sTempChd !='$') Do -- 某一层的遍历,sTempChd中是该层所有节点
SELECT traverseOneLayer(sTempChd) INTO sTempChd; -- 调用函数,返回下一层的所有节点
END WHILE;
END
==================================
call querySubTerms(254837009);