2011-01-22 18 views
1

から許可(ID、...)
3のJOIN role_permission(ID、ROLE_ID、permission_id)
MySQLの役割(ID、...)<br /> 2.私は3つのテーブル<br /> 1を持っている3つの相対テーブル

私は次のことをしたい:1つのクエリの助けを借りて、すべてのロールとこのロールのすべての権限を選択する必要があります。私のテストクエリ:

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

あなたは役割のX権限の完全なリストを生成するために、クエリ内のすべての役割、他ではその後、すべての権限を選択し、それらを横断し、最終的に左role_permissionsに参加する必要がありrole_permissionの行にフル・マトリックス内の行(ロール、許可)のエントリがない場合でも、ロールx許可の組み合わせの完全なマトリックスとLEFT結合は成功します。

+0

ありがとうございます。あなたの質問は完璧です。 – pltvs

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 

これは、あなたの権限を持つすべてのロールの権限を与えるだけでなく、権限のない役割にnull permission_idます。クロスはあなた与え参加

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 

+0

この回答は間違っています。その理由は下記の私のものを見てください。パーミッション1,2を持つロールは2行を表示し、そのロールのrole_permissionにエントリがない3,4を決して表示しません。 – RichardTheKiwi

+0

申し訳ありませんが間違っています。この問合せはすべてのロールを戻します。しかし、ロールには権限があります。私はすべての権限も選択したいと思います。 @cyberwikiの答えを見てください。彼は正しい。 – pltvs

関連する問題

 関連する問題