背景:
MySQLではレベルが制限されている場合、例えば、我々は、ツリーの根の深さのすべてのノードがツリーの最大深さを超えない、ツリーの最大深さの場合は、事前に決定することができ、我々は直接参加左によって実現することができます。
しかし、多くの時間は、我々は制御したり木の深さを認識することはできません。この場合、MySQLのストアドプロシージャ(関数)または再帰的実装プログラムで使用を使用して達成することが必要です。この記事では、達成するためにMySQLで関数を使用する方法について説明します。
まず、環境を準備
図1に示すように、テーブルの構成
1 CREATE TABLE `table_name`( 2 'id` INT(11)NOT NULL AUTO_INCREMENT、 3 ` status` INT(255)NULLの DEFAULTの NULL 、 4 ' pid` INT(11)NULLの DEFAULTの NULL 、 5 PRIMARY KEY ( `id`を)を用いてBTREE 6)ENGINE = InnoDBのAUTO_INCREMENT = 1 CHARACTERの SET = UTF8 COLLATE= utf8_general_ciのROW_FORMAT =ダイナミック。
2、挿入データ
1 INSERT INTO `table_name`のVALUES(1、12、0 ); 2 INSERT INTO `table_name`のVALUES(2、4、1 )。 3 INSERT INTO `table_name`のVALUES(3、8、2 )。 4 INSERT INTO `table_name`のVALUES(4、16、3 )。 5 INSERT INTO`table_name`のVALUES(5、32、3 )。 6 INSERT INTO `table_name`のVALUES(6、64、3 )。 7 INSERT INTO `table_name`のVALUES(7、128、6 )。 8 INSERT INTO `table_name`のVALUES(8、256、7 )。 9 INSERT INTO `table_name`のVALUES(9、512、8 )。 10 INSERT INTO `table_name`のVALUES(10、1024、9 )。 11 INSERT INTO `table_name`のVALUES(11、2048、10)。
第二に、書き込みのMySQL関数
1、クエリ現在のノードのすべての親
1デリミタ// 2は、 CREATE FUNCTIONを `getParentList`(ROOT_IDのBIGINT ) 3 RETURNS VARCHAR(1000年) 4 BEGIN 5 DECLAREの K INTの DEFAULT 0 。 6 DECLAREは FID INTの DEFAULT 1 。 7 DECLARE STR VARCHAR(1000年)DEFAULT ' $ ' ; 8 WHILEの rootId > 0 DO 9 SETは、 FID =(SELECTでのpid FROM TABLE_NAME ROOT_ID = ID)。 10 IF FID > 0 THEN 11 SET STR =連結(STR、' ' 、FID)。 12 SET ROOT_ID = FID。 13 ELSE 14 SET ROOT_ID = FID。 15 END IF 。 16 END WHILE ; 17 RETURN STR ; 18 END // 19 デリミタ。
2、クエリ現在のノードのすべての子ノードは、
1 2 デリミタ// 3は、 CREATE FUNCTION `getChildList`は(ROOT_ID BIGINTを) 4 RETURNS VARCHAR(1000年) 5 BEGIN 6 DECLAREを STR VARCHAR(1000 )。 7 DECLAREは CID VARCHAR(1000 )。 8 DECLAREの k個のINT DEFAULT 0 。 9 SETの STR = ' $ ' ; 10 SET CID = CAST(ROOT_ID AS CHAR ); 12 WHILEの CIDは、IS NOT NULL DO 13 IF K > 0 THEN 14 SETの STR = CONCAT(STR、' ' 、CID)。 15 END IF 。 16 SELECT GROUP_CONCAT(ID)INTO CID FROMテーブル名WHERE FIND_IN_SET(PID、CID)> 0 。 17 SETの K = K + 1 ; 18 END WHILE 。 19 RETURNの STR 。 20 END // 21デリミタ。
第三に、テスト
1、現在のノードのすべての親を取得
SELECT getParentList(10)。
2、現在のノードの取得のすべてのバイト
SELECT getChildList(3)。
この記事は終了......