连接多个表并返回零(如果不是一行的话,则返回零)

时间:2019-06-19 05:46:59

标签: mysql database

我正在尝试在MySQL中设置新的权限数据库,而我正在为确定非常简单的事情而绞尽脑汁。我敢肯定,这首歌在这里已经得到了解答,但是经过数小时的搜索,我仍然找不到任何有效的方法。

我有4个相关的表

权限(包含所有可能的权限)

|permission_name | description |
--------------------------------
|users.list      | etc. etc.   |
|users.update    | etc. etc.   |
|users.delete    | etc. etc.   |

用户

| id      | fname | group_id |
------------------------------
| 1       | John  | 1        |
| 2       | Nancy | 1        |
| 3       | Paul  | 2        |

| group_id | group_name |
-------------------------
| 1        | Webmasters |
| 2        | Corporate  |
| 3        | HR         |

Group_permission(包含与每个组相关的权限)

| group_id | permission_name | permission_type (1=Y|0=not set|-1=N)
----------------------------------------------
| 1        | users.list      | 1              |
| 1        | users.update    | 1              |
| 2        | users.list      | 1              |

好的,这么多的关系在继续,但是我试图获取特定用户的所有组权限,即使该组权限尚不存在。

我想象这是以权限表为基础的某种左联接,但是每当我包含WHERE user.id = 2时,它都会限制我的结果集,并且在右侧不包含空值。

SELECT a.permission_name, IFNULL(b.permission_type, 0)
FROM permission a
LEFT JOIN group_permission b on b.permission_name = a.permission_name
LEFT JOIN user c on c.group_id = b.group_id
WHERE c.id = 2

我想为南希看到的结果是

|permission_name | permission_type |
------------------------------------
|users.list      | 1               |
|users.update    | 0               |
|users.delete    | 0               |

在PHP端,我不知道用户属于哪个组,因此我只能使用用户ID进行查询。

我所得到的只是

|permission_name | permission_type |
------------------------------------
|users.list      | 1               |

任何帮助表示赞赏。 TIA

2 个答案:

答案 0 :(得分:0)

最终它只是完成此操作的子查询。

SELECT a.permission_name, IFNULL(b.permission_type, 0)
FROM permission a
NATURAL LEFT JOIN 
(
    SELECT a.group_id, a.permission_name, a.permission_type FROM group_permission a
    NATURAL LEFT JOIN users b
    WHERE b.id = 2
) as b

答案 1 :(得分:0)

不能100%确定这是否可行,但是请尝试将group_permissions表加入到权限表。

SELECT a.permission_name, IFNULL(b.permission_type, 0)
FROM group_permission a
LEFT JOIN permission b on a.permission_name = b.permission_name
LEFT JOIN user c on c.group_id = b.group_id
WHERE c.id = 2