MySQL遞歸查詢_函數語法檢查_GROUP_CONCAT組合結果集的使用


1-前言:

在Mysql使用遞歸查詢是很不方便的,不像Sqlserver可以直接使用聲明變量,使用虛擬表等等。如:DECLARE,BEGIN ...  END   ,WHILE ,IF 等等。

在Mysql可以通過創建函數,來使用上面的流程控制語句,Mysql對函數的語法檢查也是很苛刻的,可以說很煩人,不熟悉的人估計會哭。。。

 

2-遞歸查詢關鍵部分:

  a-我的表結構:

  

 

  b-我的遞歸腳本:

  用於查詢:當前類目ID及所有的父級元素的ID使用逗號分割開的一個字符串:

  下面腳本里使用了組合結果集的一個函數:GROUP_CONCAT,使用該函數可以在查不到結果的時候繼續給pid賦值,從而跳出循環,詳細可參考文章下面的注意點。

  SELECT ParentID INTO pid FROM product_leimu WHERE 1=2; -- 找不到數據的情況下, INTO 無法給pid賦值,pid結果不變,

  SELECT GROUP_CONCAT(ParentID) INTO pid FROM product_leimu WHERE 1=2; -- 找不到數據的情況下,通過函數GROUP_CONCAT組合之后,可以繼續使用INTO 給pid賦值,pid結果為NULL

   

DROP FUNCTION IF EXISTS `fn_getLeimuPath`;

CREATE DEFINER = `sa`@`%` FUNCTION `fn_getLeimuPath`(`subId` int)
 RETURNS varchar(1000)
BEGIN
DECLARE pathID VARCHAR(4000) DEFAULT subId;
DECLARE pid INT default subid;

WHILE pid>0 DO
    SELECT GROUP_CONCAT(ParentID) INTO pid FROM product_leimu WHERE ID = pid;
    IF pid>0 THEN
        SET pathID = concat(pid, ',', pathID);
    END IF;
END WHILE;

RETURN pathID;
END;

 

  查詢結果展示:

  

 

3-一些需要注意的點,函數的一些特殊語法檢查:

 a-腳本結束標記檢查:  分號檢查:

  如:每個獨立的腳本語句;   流程控制語句結尾:END IF;  END;   END WHILE;

b-流程控制語句組合:   

  如: 

   IF 條件 THEN 

    代碼

  ELSEIF

    代碼

       END IF;

 

  WHILE 條件 DO

    代碼

  END WHILE;

c-特殊函數的使用:

  函數:GROUP_CONCAT:將結果集鏈接在一起,使用逗號分隔,group_concat([DISTINCT] 要連接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])

  備注: 這個函數可以在找不到數據的情況下,繼續執行從而給INTO的變量賦值。   比較神奇:

SELECT ParentID INTO pid FROM product_leimu WHERE 1=2;     -- 找不到數據的情況下, INTO 無法給pid的結果不變,
SELECT GROUP_CONCAT(ParentID) INTO pid FROM product_leimu WHERE 1=2;   -- 找不到數據的情況下,通過函數GROUP_CONCAT組合之后,可以繼續使用INTO 給pid賦值,NULL

  我們這里是想在查不到的結果的時候,通過WHILE的判斷結束循環,如果不通過GROUP_CONCAT函數將結果傳給pid,那么將會進入無線循環當中,是很坑的!! 下面腳本的代碼結果是:2

DECLARE pid INT;

SELECT ParentID INTO pid FROM product_leimu WHERE 1=2;

IF pid IS NULL THEN
    SET pid=1;
END IF;

SELECT GROUP_CONCAT(ParentID) INTO pid FROM product_leimu WHERE 1=2;

IF pid IS NULL THEN
    SET pid=2;
END IF;

 


免責聲明!

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



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