我现在有四张桌子,users
,user_groups
,user_group_memberships
和user_group_permissions
。user_group_memberships
用于将 a 链接users.id
到 auser_groups.user_id
并user_group_permissions
用于将组的成员链接到权限/权限列表。
我想运行一个查询,从 user_groups 获取所有组的数组,并在同一个查询中从 user_group_memberships 获取每个组中的成员数,然后我想从 user_group_permissions 获取用户策略的名称。
user_groups
如果每个人都有成员,user_group_memberhips
并且如果每个user_groups
记录都在 . 中设置了策略,则查询“有效” user_group_permissions
,但这不会返回任何尚未分配成员或用户策略的组。我是否误解了 ifNULL
或我的 JOIN 的处理?
SELECT ug.*,
(SELECT count(*) FROM user_group_memberships WHERE ug.id = ugm.group_id) AS member_count,
(SELECT policy_name FROM user_group_permissions WHERE ugp.id = ug.user_policy_id) AS policy_name
FROM
user_groups AS ug
LEFT JOIN
user_group_memberships AS ugm ON ug.id = ugm.group_id
LEFT JOIN
user_group_permissions AS ugp ON ug.user_policy_id = ugp.id
WHERE
ug.organisation_id=?
users
+----+-----------------+
| id | username |
+----+-----------------+
| 1 | Thomas |
| 2 | Harry |
+----+-----------------+
user_groups
+----+-----------------+-------------------+------------+
| id | organisation_id | user_permission_id| group_name |
+----+-----------------+-------------------+------------+
| 1 | 123 | 1 | Finance |
| 2 | 123 | 2 | Support |
+----+-----------------+-------------------+------------+
user_group_memberships
+----+-----------------+----------+----------+
| id | organisation_id | user_id | group_id |
+----+-----------------+----------+----------+
| 1 | 123 | 1 | 1 |
| 2 | 123 | 2 | 1 |
+----+-----------------+----------+----------+
user_group_permissions
+----+-----------------+
| id | policy_name |
+----+-----------------+
| 1 | Finance |
| 2 | Support |
+----+-----------------+
使用上面的示例,我希望我的查询返回两行(每个组一个),member_count = 2
组 1(第 1 行)和member_count = 0
组 2(第 2 行)。目前它只为组 1 返回一个,因为member_count
存在/不为空。它不返回组 2 的数据,因为组 2 中没有group_memberships
满足 COUNT() 的记录。
当user_groups.user_permissions_id
为 NULL 时也会出现同样的问题,如果组有成员并且组设置了 user_permission_id,它只会返回组记录。