查詢部門及其子部門相關方案總結

2021-10-08 10:52:45 字數 1857 閱讀 7467

公司需求:匯入員工資訊時。需判斷當前管理員的許可權,當前管理員為超級管理員時可以匯入公司所有部門的員工資訊,部門管理員只能匯入本部門及以下子部門的員工資訊,特定部門只能匯入特定部門的資訊。

思考:特定部門和所有部門的容易實現,但是查詢部門及其子部門不易實現。

1.方案一:可以在service層進行遞迴迴圈呼叫,一直遞迴迴圈到方法查詢不到資料,

該方案缺點很顯而易見,需要多次鏈結mysql進行查詢,效率肯定不高。

2.方案二:寫儲存過程的方式,見下面大佬寫的

mysql中實現遞迴查詢

該方案需要建立儲存過程,不太推薦,具體見這位大佬

為什麼不推薦使用儲存過程?

3.方案三:sql本身遞迴查詢

該sql使用了find_in_set精準查詢,concat拼接函式

select id from

(select id, parent, name from department where parent is

notnull

) rd,

(select

@pid : 1

) pd

where

find_in_set( parent,

@pid

)>

0and

@pid := concat(

@pid

,','

, id )

利用@pid臨時引數,每次匹配到乙個符合條件的,則將id加入@pid變數中。

過濾時,利用find_in_set從@pid中查詢parent_id存在的資料。

最終綜合考慮使用方案三
但是在spring data jpa中使用按照以下格式使用 在:=前加上轉義字元,不然啟動就報錯。

會拋此異常 space is not allowed after parameter prefix 『:』

@query

(value

="select id from ( select id, parent, name from department where parent is not null) rd,"

+"(select @pid \\:= (select manage_scope from new_admin where phone = ?1 )) pd "

+"where find_in_set( parent, @pid ) > 0 and @pid \\:= concat( @pid, ',', id ) "

, nativequery =

true

)

查詢父級部門

select t2.id

from

(select

@ras _id,

(select

@r := parent from department where id = _id)

as parent_id,

@l :=@l+

1as lvl

from

(select

@r :=

'28'

,@l :=

0) vars,

department h

where

@r<>

0) t1

join department t2

on t1._id = t2.id

order

by t1.lvl desc

查詢 子部門sql

1 建立儲存過程 procedure structure for getdeptchild drop procedure if exists getdeptchild delimiter create definer sunxing ccs procedure getdeptchild rootid...

使用標量函式建立無限的查詢子部門

使用標量函式建立無限的查詢子部門 不包含自身 alter function f getchildren pid int returns tree table tdtid int as begin insert tree select tdtid from tdept where tdtpid pid...

Mysql 查詢部門下所有部門

話不多說,直接上sql select dept id,dept name from select t1.dept id,t1.dept name,if find in set parent id,pids 0,pids concat pids,dept id 0 as ischild from se...