显示地图的非加入 mysql 中的行吗?

标签: sql MySQL
发布时间: 2015/6/12 0:14:07
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有三个表

权限

id | name
 1 | do.this
 2 | do.that
 3 | dont.this
 4 | dont.that
 5 | neither.this
 6 | both.that

角色

id | name
 1 | doer
 2 | donter

permission_role

permission_id | role_id
            1 | 1
            2 | 1
            6 | 1
            3 | 2
            4 | 2
            6 | 2

这样的查询下,我们可以得到所有角色的用户具有像这样

permission_id | permission_name | role_id | role_name
            1 | do.this         |       1 | doer
            2 | do.that         |       1 | doer
            6 | both.that       |       1 | doer
            3 | dont.this       |       2 | donter
            4 | dont.that       |       2 | donter
            6 | both.that       |       2 | donter

查询

SELECT 
p.id AS permission_id, p.name AS permission_name, 
r.id AS role_id, r.name AS role_name FROM permission_role pr 
JOIN permissions p ON pr.`permission_id` = p.id
JOIN roles r ON pr.`role_id` = r.id;

问题

我想知道的,我们可如何扭转此查询,那么创建一个结果集清单角色拥有的所有权限如下所示:

permission_id | permission_name | role_id | role_name
            3 | dont.this       |       1 | doer
            4 | dont.that       |       1 | doer
            5 | neither.this    |       1 | doer
            1 | do.this         |       2 | donter
            2 | do.that         |       2 | donter
            5 | neither.this    |       2 | donter

解决方法 1:

这种类型的查询的逻辑开始与生成的所有组合的角色和权限,然后删除那些存在 (使用 left outer join )。

select p.id as permission_id, p.name as permission_name,
       r.id as role_id, r.name as role_name
from roles r cross join
     permissions p left outer join
     permission_role pr
     on pr.permission_id = p.id and
        pr.role_id = r.id
where pr.role_id is null;
官方微信
官方QQ群
31647020