MySQLのクエリID親または子IDカスタム関数は再帰的で達成します

背景:

MySQLではレベルが制限されている場合、例えば、我々は、ツリーの根の深さのすべてのノードがツリーの最大深さを超えない、ツリーの最大深さの場合は、事前に決定することができ、我々は直接参加左によって実現することができます。

しかし、多くの時間は、我々は制御したり木の深さを認識することはできません。この場合、MySQLのストアドプロシージャ(関数)または再帰的実装プログラムで使用を使用して達成することが必要です。この記事では、達成するためにMySQLで関数を使用する方法について説明します。

まず、環境を準備

 

図1に示すように、テーブルの構成

1  CREATE  TABLE `table_name`(
 2    'id` INT11NOT  NULL AUTO_INCREMENT、
 3    ` status` INT255NULLの DEFAULTの NULL 4    ' pid` INT11NULLの 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`のVALUES1120 );
2  INSERT  INTO `table_name`のVALUES241 )。
3  INSERT  INTO `table_name`のVALUES382 )。
4  INSERT  INTO `table_name`のVALUES4163 )。
5  INSERT  INTO`table_name`のVALUES5323 )。
6  INSERT  INTO `table_name`のVALUES6643 )。
7  INSERT  INTO `table_name`のVALUES71286 )。
8  INSERT  INTO `table_name`のVALUES82567 )。
9  INSERT  INTO `table_name`のVALUES95128 )。
10  INSERT  INTO `table_name`のVALUES1010249 )。
11  INSERT  INTO `table_name`のVALUES11204810)。

 

第二に、書き込みのMySQL関数

 

1、クエリ現在のノードのすべての親

1デリミタ//  
2は、 CREATE  FUNCTIONを `getParentList`(ROOT_IDのBIGINT 3       RETURNS  VARCHAR1000年4       BEGIN  
5            DECLAREの K INTの DEFAULT  0 6          DECLAREは FID INTの DEFAULT  1 7          DECLARE  STR  VARCHAR1000年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  VARCHAR1000年5       BEGIN  
6         DECLAREを STR  VARCHAR1000 )。 
7         DECLAREは CID VARCHAR1000 )。 
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)。

 

この記事は終了......

おすすめ

転載: www.cnblogs.com/cmacro/p/11937341.html