mysql 高效獲取用戶被授權(quán)的分級結(jié)構(gòu)
在復(fù)雜的授權(quán)結(jié)構(gòu)下,查詢用戶被授權(quán)的分級結(jié)構(gòu)十分重要。本文將探討如何有效率地從 mysql 數(shù)據(jù)庫中獲取用戶被授權(quán)的 f、e 和 d 列表,并支持分頁功能。
需求分析
用戶通過不同授權(quán)模式可獲授權(quán):
- [1] 全部授權(quán) d、e、f
- [2] 授權(quán) d,包括 d 下所有 e 和 f
- [3] 授權(quán) d > e,包括 e 下所有 f
- [4] 授權(quán) d > e > f
- [5] 授權(quán) area,包括所有屬于 area 的 f,跨 d,跨 d > e
- [6] 授權(quán) d 下的 area ,含 d 下所有在 area 的 f,跨 d > e
- [7] 授權(quán) d > e 下的 area ,含 e 下所有在 area 的 f
查詢策略
針對用戶被授權(quán)的 f 列表,數(shù)量較多,需要分頁,且去重。可采用以下查詢策略:
select f.f_id, f.f_name, f.f_area from p join f on p.f_id = f.f_id or p.f_id = 0 where p.u_id = @user_id and (p.d_id = f.d_id or p.d_id = 0) and (p.e_id = f.e_id or p.e_id = 0) and (p.a_code = f.f_area or p.a_code = "") order by f.f_id limit x, y
登錄后復(fù)制
其中,x 為起始索引,y 為每頁的數(shù)量。
對于用戶被授權(quán)的 e 和 d 列表,可采用類似查詢策略:
-- E 列表查詢 SELECT E.E_id, E.E_name FROM P JOIN E ON P.E_id = E.E_id OR P.E_id = 0 WHERE P.U_id = @user_id AND (P.D_id = E.D_id OR P.D_id = 0) ORDER BY E.E_id LIMIT x, y -- D 列表查詢 SELECT D.D_id, D.D_name FROM P JOIN D ON P.D_id = D.D_id OR P.D_id = 0 WHERE P.U_id = @user_id ORDER BY D.D_id LIMIT x, y
登錄后復(fù)制