请教一个mysql查询语句

新手上路,请多包涵

现在有三个表tb_role,tb_permission,tb_role_permission,
tb_role

tb_permission

tb_role_permission

tb_role的树结构是这样的
role_tree

底层权限最低,上一层拥有子树的所有权限,要查出能访问某条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查出来,这样效率实在太低了。

请问大家,能否一次将我想要结果查出来,具体语句怎么写呢?

阅读 1.5k
2 个回答

这里 SQL 能不能一次性全查出来我不清楚,不过可以给你个思路:

其实这种权限的东西,可以在系统初始化的时候就全部读到内存中做一个缓存啊(比如 Java 中就映射成 POJO),这样再去循环什么的就不会太有性能问题,你这里的场景甚至可以直接缓存成 路由-权限 的实体以供查询。

等到刷新权限表的时候再通知一下系统重载数据库内容。

lft和rgt是干嘛的?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题