之前做的乙個系統,裡面涉及乙個組織機構,之前也做過,之前做得非常簡單普遍
資料庫表結構主要是乙個主鍵id,名稱name,乙個父級外來鍵parent_id
比如id name parent_id
1 汕頭公司 null
2 計算機中心 1
3 人事部 1
類似這樣,相信大家都能想到,新增,修改都很方便,但查詢就出現乙個問題,就是比如你想得到汕頭公司裡面的員工,包括子部門的話,就必須得用遞迴,遞迴這東西,想起來很傷腦的,如果層數比較多,資料量比較大的話還非常耗效能的。
後面我想了另乙個資料庫結構,也是比較通俗易懂,適合我這麼笨的人。
我直接上資料吧,相信比我聰明的人一看就知道了。
如圖,我主要是增加了乙個parent_ids這個字段,這個字段主要記錄了,當前的部門上級部門總共有哪些部門。
那麼當你要查詢時,你可以這樣,比如你要查詢汕頭公司(id 為149)以下包括子部門所有的員工
select e.* from employee e inner join org o on e.org_id=o.id where o.id=149 or find_in_set(149,o.parent_ids);
這樣裡面用的是like 可能效率不高,但至少不用遞循了,也比較容易理解。
如果你要移動的話,這個可能理解起來有點麻煩,我一開始也是忽略其中一些小問題,導致移動位置時parent_ids出錯了
比如你要移動汕頭公司(id為149)到上海公司(id為148)裡面
最好用事務處理
首先查詢到上海公司的parent_ids為1,,那麼汕頭公司的parent_ids就為1,148,了
update org set parent_ids='1,148,',parent_id=148 where id=149
然後還得更新汕頭公司所有子部門的parent_ids
update org set parent_ids=concat('1,148,',substring_index(parent_ids,'1,',-1)) where find_in_set(149,parent_ids);
這一步可能很多同學看不懂,我剛開始也忽略了這一步,後面移動位置時,parent_ids就出錯了。
懂了查詢跟修改,那刪除也是比較簡單的
delete * from org where o.id=149 or find_in_set(149,parent_ids);
新增就更簡單了,這兒就是寫了。
希望對大家有用處。
組織機構樹查詢
組織機構樹遞迴查詢 查詢父級節點的所有子節點 select organizational id,organizational name,parent id from sys organizational where is used 1 start with parent id 父級節點id conn...
java 遞迴查詢組織機構樹
需求 不要在資料庫層寫儲存過程或者呼叫資料庫自帶方法實現,因為資料庫有可能是mysql或者是oracle。核心遞迴 description 遞迴查詢機構 param param departlist param param departid 設定檔案 return void 返回型別 throws ...
SQL遞迴查詢實現組織機構樹
系統用到的組織機構樹,要實現對當前節點以及其子節點的查詢,資料庫sql要用到遞迴查詢,這也是我第一次接觸sql的遞迴查詢。先說一下什麼是遞迴查詢,簡單說來是將乙個樹狀結構儲存在一張表裡,比如乙個表中存在兩個字段 code,parent code,那麼通過表示每一條記錄的parent是誰,就可以形成乙...