大家在做專案的時候,展示樹形結構的資料,肯定遇到需要通過父節點遞迴查詢所有子節點的情況,
也應該做過通過子節點查詢所有父級節點的需求。
本次遇到的需求是一次性查詢多個子節點的所有父級節點的情況。
多個節點我們考慮到要去除重複節點。
常規做法:
1. 資料庫中寫乙個自定義函式,查詢當前節點的所有父級節點
dropfunction
ifexists
fn_getparentnodes;
create
function fn_getparentnodes(currentid varchar(64
))returns
varchar(1000
)begin
declare parentid varchar(100
);
declare tempstr varchar(1000) default
currentid;
while currentid is
notnull
do
set parentid = (select pid from dept where id =
currentid );
if parentid is
notnull
then
set tempstr = concat(parentid,','
,tempstr);
set currentid =
parentid;
else
set currentid =
parentid;
endif
;
endwhile
;return
tempstr;
end;
select id,pid,name from dept where find_in_set(id, fn_getparentnodes('11'))
2. 後台多次傳遞子節點呼叫當前子節點子查詢所有父級節點。
3.單次呼叫到的結果存到list中。
4.多次呼叫的結果彙總,去重作為最終結果。
其實還有種最簡單的做法:利用union查詢,結果自動去重
select id,pid,name from dept where find_in_set(id, fn_getparentnodes('11'如果達到如上效果,一種在mysql執行動態sql,))union
select id,pid,name from dept where find_in_set(id, fn_getparentnodes('18'
))order
by pid
還有一種是通過mybatis foreach標籤實現:
/*** 查詢多個部門的所有父級部門(遞迴,資料量大,肯定影響效能)
* @param
deptids
* @return
*/list
getparentzteenodebydeptids(@param("deptids") string deptids);
<這樣能通過一次傳遞多個子節點引數 deptids = 11,18,完成最終結果查詢。select
id="getparentztreenodebydeptids"
resulttype
="com.core.node.ztreenode"
>
<
foreach
collection
="deptids"
index
="index"
item
="i"
separator
="union"
>
select
id,pid,name
from dept
where find_in_set(id, fn_getparentnodes(#))
foreach
>
order by pid;
select
>
一次master節點notReady的修復過程
這天開啟電腦,發現master節點的狀態異常,是notready狀態。其他計算機點還好時ready狀態。首先通過命令etcdctl member list確認etcd集群是ok的。這時檢查master節點上的各個kube相關程序都在.但通過systemctl status kubelet,kubel...
用Metasploit完成的一次滲透測試
metasploit是乙個相當優秀的滲透工具,他不僅有強大的功能,還有簡單的操作。這使得metasploit成為了業內最著名的工具。我們可以用metasploit進行很多對目標的攻擊操作,例如對計算機的作業系統進行攻擊,對目標機的應用程式進行攻擊,對客戶端發起攻擊等等。metasploit這個工具不...
Struts2完成一次請求的過程
struts2請求過程 1.當servlet容器接收到乙個請求後,將請求交給你在web.xml檔案中配置的過濾器filterdispatcher,呼叫它的dofilter 方法。4.filterdispatcher呼叫dispatcher類的serviceaction 方法。5.dispatcher...