1

我现在有四张桌子,usersuser_groupsuser_group_membershipsuser_group_permissionsuser_group_memberships用于将 a 链接users.id到 auser_groups.user_iduser_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,它只会返回组记录。

4

1 回答 1

1

您对相关子查询的使用是错误的。此外,要获取成员数,您不需要使用子查询;你可以Group by使用Count().

尝试:

SELECT ug.id,  
       ug.organisation_id, 
       ug.group_name, 
       COUNT(ugm.group_id) AS member_count,
       ugp.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=? 
GROUP BY 
  ug.id, 
  ug.organisation_id, 
  ug.group_name, 
  ugp.policy_name 
于 2018-10-11T12:22:55.613 回答