MySQL - 由于 NULL 嵌套 SELECT 和 JOIN 而缺少行

MySQL - Missing rows due to NULL nested SELECT and JOIN

目前我有四张桌子,usersuser_groupsuser_group_membershipsuser_group_permissionsuser_group_memberships 用于 link 一个 users.id 一个 user_groups.user_iduser_group_permissions 用于 link 一个组的成员到一个列表 permissions/rights.

我想 运行 一个查询,它从 user_groups 中获取所有组的数组,并在同一个查询中从 user_group_memberships 中获取每个组中的成员数量,然后我想从 user_group_permissions 中获取用户策略的名称。

查询 'works' if every user_groups has members in user_group_memberhips and if every user_groups record has a policy set in user_group_permissions., 但是这个不会 return 任何尚未分配成员或用户策略的组。我是否误解了 NULL 或我的 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         |
+----+-----------------+

使用上面的示例,我希望我的查询 return 两行(每组一行),member_count = 2 用于第 1 组(第 1 行),member_count = 0 用于第 2 组(第 2 行)。目前,第 1 组只有 return 一个,因为 member_count exists/is 不为空。 return第 2 组没有数据,因为 group_memberships 中第 2 组没有记录来满足 COUNT()。

user_groups.user_permissions_id为NULL时也会出现同样的问题,只有return一个群组记录,如果群组有成员并且群组有user_permission_id设置。

您对 Correlated subqueries 的用法是错误的。另外,要获取成员数,您不需要使用子查询;您可以将 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