2011-01-22 21 views
1

JOIN我有3個表
1.角色(ID,...)
2.許可(ID,...)
3. role_permission(ID,ROLE_ID,permission_id)
MySQL的3個相表

我想要做的下一個:我應該選擇所有角色和所有權限的這個角色與一個查詢的幫助。我的測試查詢:

SELECT `rp`.*, `r`.`role`, `r`.`id` AS `role_id`, `p`.`id` AS 
`permission_id`,`p`.`name` AS `permission` FROM `role_permission` AS `rp` RIGHT JOIN 
`role` AS `r` ON r.id = rp.role_id RIGHT JOIN `permission` AS `p` ON p.id = rp.permission_id 

但是這個查詢只選擇那些角色,有什麼權限。但我需要選擇所有角色和所有權限(在role_permission中存在行或不)。

預先感謝您。對不起我的英語不好。

回答

1

您需要選擇在查詢中的所有角色,然後在另一個的所有權限,越過他們終於離開加盟role_permissions產生的作用X權限的完整列表

SELECT rp.*, r.role, r.id AS role_id, p.id AS permission_id,p.name AS permission 
FROM permission AS p 
CROSS JOIN role AS r 
LEFT JOIN role_permission AS rp ON p.id = rp.permission_id 
    AND r.id = rp.role_id 

的交叉連接給你一個完全矩陣的角色x權限組合,並且即使role_permission中的行沒有任何行(角色,權限)條目在全矩陣中,LEFT聯接也會成功。

2

你想要一個left join

select 
    r.role, 
    r.id as role_id, 
    p.id as permission_id 

from role 

left join role_permission rp on rp.role_id = role.id 
left join permission p on p.id = rp.permission_id 

這會給你與權限的所有角色的權限,以及對角色的空permission_id沒有權限。

+0

這個答案不正確。請參閱下面的原因。具有權限1,2的角色將在此處顯示2行,並且永遠不會顯示在角色的role_permission中沒有條目的3,4。 – RichardTheKiwi 2011-01-22 22:03:07

+0

對不起,但不正確。該查詢返回所有角色。但角色有權限。我也想選擇所有權限。請參閱@cyberwiki答案。他是對的。 – pltvs 2011-01-22 22:07:26