MySQL - 由于 NULL 嵌套 SELECT 和 JOIN 而缺少行
MySQL - Missing rows due to NULL nested SELECT and JOIN
目前我有四张桌子,users
、user_groups
、user_group_memberships
和 user_group_permissions
。 user_group_memberships
用于 link 一个 users.id
一个 user_groups.user_id
和 user_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 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