现在有三个表tb_role,tb_permission,tb_role_permission,
tb_role的树结构是这样的
底层权限最低,上一层拥有子树的所有权限,要查出能访问某条url的所有角色,比如说查询/app/upload
,对应语句为:
select
parent.role_name
from
tb_role node,
tb_role parent
where
node.lft between parent.lft and parent.rgt
and node.role_name=
(
select
t1.role_name
from
tb_role t1,
tb_role_permission t2,
tb_permission t3
where
t1.id=t2.role_id
and t2.permission_id=t3.id
and t3.url = '/app/upload'
)
得到的结果为:
+--------------------+
| role_name |
+--------------------+
| ROLE_ADMINISTRATOR |
| ROLE_SUPERVISOR |
| ROLE_MANAGER |
| ROLE_DEVELOPER |
+--------------------+
4 rows in set
现在的问题是我需要一次性将tb_permission
中的url
所对应role_name
集合全查出来,想半天实在想不出来,现在暂时的做法是先
select * from tb_permission
然后再循环遍历,用上面那条语句再将每个url对应的role_name查出来,这样效率实在太低了。
请问大家,能否一次将我想要结果查出来,具体语句怎么写呢?
这里
SQL
能不能一次性全查出来我不清楚,不过可以给你个思路:其实这种权限的东西,可以在系统初始化的时候就全部读到内存中做一个缓存啊(比如
Java
中就映射成POJO
),这样再去循环什么的就不会太有性能问题,你这里的场景甚至可以直接缓存成 路由-权限 的实体以供查询。等到刷新权限表的时候再通知一下系统重载数据库内容。