MySql 利用函數 查詢所有子節點


  前提:mysql  函數  find_in_set(str,strlist), cast(value as type)

  一、find_in_set(str,strlist):如果字符串str是在的strlist組成的N子串的字符串列表,返回值的范圍為1到N。

   如果str不在strliststrlist為空字符串,則返回值為 0 。如任意一個參數為NULL,則返回值為 NULL。 這個函數在第一個參數包含一個逗號(',')時將無法正常運行。

   ①find_in_set(str,strlist)與in()的區別: 當find_in_set(str,strlist)中strlist的值是常數的時候,其效果就相當於in();

    eg:   select * from t_areainfo where FIND_IN_SET(name,'中國,華北區,華南區')  ==  select * from t_areainfo where name in ('中國','華北區','華南區')

   ②find_ind_set(str,strlist)與like區別: like是廣泛的模糊匹配,字符串中沒有分隔符,Find_IN_SET 是精確匹配,字段值以英文”,”分隔,Find_IN_SET查詢的結果要小於like查詢的結果。

    eg: 

select * from t_areainfo t where t.`name` like '%XX區%'

      

select * from t_areainfo t where FIND_IN_SET('XX區',t.`name`)                                  select * from t_areainfo t where FIND_IN_SET('北京XX區4',t.`name`)

                   

 二、cast(value as type):用戶數據類型轉換

      eg:cast('1' as  int) 將char類型的值'1',轉換成 int型的 1;

  言歸正傳:使用mysql 函數來查找 所有子節點

DROP FUNCTION IF EXISTS queryChildrenAreaInfo;   
CREATE FUNCTION `queryChildrenAreaInfo` (areaId INT)  //創建一個函數  queryChildrenAreaInfo(areaId int) 參數為int型
RETURNS VARCHAR (4000)                   //定義返回值類型 varchar(4000) BEGIN                            //函數開始 DECLARE sTemp VARCHAR (4000);             //定義一個varchar類型的參數 DECLARE sTempChd VARCHAR (4000);           //定義一個varchar類型的參數 SET sTemp = '$';                      //給sTmp賦值 SET sTempChd = cast(areaId AS CHAR);          //將函數中的int型的參數轉換成 char型 賦值給sTempChd
WHILE sTempChd IS NOT NULL DO              //循環體 SET sTemp = CONCAT(sTemp, ',', sTempChd);       //拼接sTemp SELECT group_concat(id) INTO sTempChd FROM t_areainfo WHERE FIND_IN_SET(parentId, sTempChd) > 0; //根據父節點,查詢出該父節點下的所有子節點的id,支持多級查詢 END WHILE; RETURN sTemp; END;

  調用方式:

select * from t_areainfo t where FIND_IN_SET(id,queryChildrenAreaInfo(4))

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM