1. 程式人生 > >通過父級id獲取到其下所有子級(無窮級)id及父級id——Mysql函數實現

通過父級id獲取到其下所有子級(無窮級)id及父級id——Mysql函數實現

led cti creator returns ror mod har 為什麽 界面


【需求】某用戶只能查看其自己信息及其下級信息,涉及通過該用戶所在部門獲取其下所有部門(多層)id集合。

步驟一:對數據庫進行設置:

set global log_bin_trust_function_creators=TRUE;

 可以在Navicate點擊工具欄的【工具】-> 【命令行界面】執行以上語句;也可以在服務器上進入數據庫執行。

步驟二:執行以下sql語句,生成sql方法。

CREATE FUNCTION `getChildList`(`rootId` VARCHAR(32)) RETURNS varchar(4000) CHARSET utf8
BEGIN
    DECLARE sTemp VARCHAR(4000);
    DECLARE sTempChd VARCHAR(4000);
   DECLARE count INT DEFAULT 0;

    SET sTemp = ‘‘;-- 返回值
    SET sTempChd =cast(rootId as CHAR); -- 父id		
   -- 判斷父id是否存在
   SET count=(SELECT count(1) from sys_dept WHERE Id=rootId);
   IF count>0 THEN
	-- 遍歷拼接所有子節點id
	WHILE sTempChd is not null DO
		SET sTemp = concat(sTemp,‘,‘,sTempChd);
		SELECT group_concat(Id) INTO sTempChd FROM sys_dept where FIND_IN_SET(Parent_Id,sTempChd)>0;
	END WHILE;
   END IF;
     RETURN sTemp;
END

測試:

技術分享圖片

解釋:為什麽需要步驟一的配置?

如果不配置的話,該函數在生成的時候會報錯。

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable) 

報錯原因:

這是我們開啟了bin-log, 我們就必須指定我們的函數是否是

1 DETERMINISTIC 不確定的

2 NO SQL 沒有SQl語句,當然也不會修改數據

3 READS SQL DATA 只是讀取數據,當然也不會修改數據

4 MODIFIES SQL DATA 要修改數據

5 CONTAINS SQL 包含了SQL語句

其中在function裏面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我們開啟了 bin-log, 我們就必須為我們的function指定一個參數。

通過父級id獲取到其下所有子級(無窮級)id及父級id——Mysql函數實現