由于空嵌套select and join而缺少行

2skhul33  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(368)

我现在有四张table, users , user_groups , user_group_memberships 以及 user_group_permissions . user_group_memberships 用于链接 users.iduser_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时,才会返回组记录。

cnwbcb6i

cnwbcb6i1#

使用相关子查询是错误的。另外,要获得成员数,不需要使用子查询;你可以用 Group byCount() .
尝试:

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

相关问题