MySQL遞迴查詢_函式語法檢查_GROUP_CONCAT組合結果集的使用
1-前言:
在MySL使用遞迴查詢是很不方便的,不像SQL Server可以直接使用宣告變數,使用虛擬表等等。如: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)
BEGINDECLARE 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;
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-10/154856.htm