鍍金池/ 問答/數(shù)據(jù)庫/ 請教一個mysql查詢語句

請教一個mysql查詢語句

現(xiàn)在有三個表tb_role,tb_permission,tb_role_permission,
tb_role

tb_permission

tb_role_permission

tb_role的樹結(jié)構(gòu)是這樣的
role_tree

底層權(quán)限最低,上一層擁有子樹的所有權(quán)限,要查出能訪問某條url的所有角色,比如說查詢/app/upload,對應(yīng)語句為:

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'
        )

得到的結(jié)果為:

+--------------------+
| role_name          |
+--------------------+
| ROLE_ADMINISTRATOR |
| ROLE_SUPERVISOR    |
| ROLE_MANAGER       |
| ROLE_DEVELOPER     |
+--------------------+
4 rows in set

現(xiàn)在的問題是我需要一次性將tb_permission中的url所對應(yīng)role_name集合全查出來,想半天實在想不出來,現(xiàn)在暫時的做法是先

select * from tb_permission

然后再循環(huán)遍歷,用上面那條語句再將每個url對應(yīng)的role_name查出來,這樣效率實在太低了。

請問大家,能否一次將我想要結(jié)果查出來,具體語句怎么寫呢?

回答
編輯回答
我不懂

lft和rgt是干嘛的?

2017年9月17日 08:08
編輯回答
眼雜

這里 SQL 能不能一次性全查出來我不清楚,不過可以給你個思路:

其實這種權(quán)限的東西,可以在系統(tǒng)初始化的時候就全部讀到內(nèi)存中做一個緩存?。ū热?Java 中就映射成 POJO),這樣再去循環(huán)什么的就不會太有性能問題,你這里的場景甚至可以直接緩存成 路由-權(quán)限 的實體以供查詢。

等到刷新權(quán)限表的時候再通知一下系統(tǒng)重載數(shù)據(jù)庫內(nèi)容。

2017年8月29日 15:31