我现在有四张table, users
, user_groups
, user_group_memberships
以及 user_group_permissions
. user_group_memberships
用于链接 users.id
到 user_groups.user_id
以及 user_group_permissions
用于将组成员链接到权限/权限列表。
我想运行一个查询,从user\u groups获取所有组的数组,并在同一个查询中从user\u group\u memberships获取每个组中的成员数,然后我想从user\u group\u permissions获取用户策略的名称。
如果每个 user_groups
中有成员 user_group_memberhips
如果每个 user_groups
记录中设置了策略 user_group_permissions
,但这不会返回尚未分配成员或用户策略的任何组。我是不是误解了 NULL
还是我的加入?
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
如果为空,则仅当组有成员并且组设置了用户权限id时,才会返回组记录。
1条答案
按热度按时间cnwbcb6i1#
使用相关子查询是错误的。另外,要获得成员数,不需要使用子查询;你可以用
Group by
与Count()
.尝试: