drop function if exists `fun_get_children`;
delimiter ;;
create definer=`root`@`127.0.0.1` function `fun_get_children`(i_id int(32)) returns varchar(20000) charset utf8
deterministic
begin
declare _result varchar(20000);
declare _ids varchar(20000);
set _result = cast(i_id as char);
set _ids = cast(i_id as char);
while _ids is not null do
set _result = concat(_result, ',', _ids);
select group_concat(m.tree_id) into _ids
from module m where find_in_set(m.parent_id, _ids) > 0;
end while;
return _result;
end;
delimiter ;
--呼叫方式
1. select fun_get_children(1);
2. select * from module where find_in_set(id, fun_get_children(1));
ps:1. 沒有deterministic關鍵字會報錯。
2.結果中會有重複值,但作為查詢子條件對最終結果沒有影響。
3.最好為function而不是procedure,如果是後者無法在sql用呼叫方式的兩種方法進行呼叫。
4.如果在查詢語句的where條件中應該用find_in_set(str, strlist)關鍵字,如:where find_in_set(id, fun_get_modules(1))。
mysql根據子節點查詢父級節點
表結構 create table t test id varchar 64 name varchar 64 parentid varchar 64 基礎資料 insert into t test id,name,parentid value 1 一級選單 0 insert into t test i...
根據子節點遞迴查詢所有父節點
有個需求,需要根據給定的子節點向上遞迴查詢所有父節點,網上查詢了一些,但是都不是很滿意,有的是需要用到全域性變數定義儲存列表,但是會有併發問題,然後自己手寫乙個 test void contextloads1 public listgetpid listidlist,integer pid,list...
oracle 根據子節點取出父節點sql
oracle 根據子節點取出父節點sql 1 今天在做專案的時候,有乙個需求,需要根據子節點求出父節點的值.sql語句為 select g.id from t dict g start with g.id in 283 connect by prior g.parent id g.id 上面sql中...