MySQL-由于NULL嵌套的SELECT和JOIN导致行丢失

时间:2018-10-11 11:59:04

标签: mysql join select nested-select

我目前有四个表,usersuser_groupsuser_group_membershipsuser_group_permissionsuser_group_memberships用于将users.id链接到user_groups.user_id,而user_group_permissions用于将组成员链接到权限/权限列表。

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

如果每个user_groupsuser_group_memberhips中都有成员,并且每个user_groups记录在user_group_permissions中都设置了策略,则查询“有效”,但这不会返回任何内容。尚未分配成员或用户策略的组。如果我是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         |
+----+-----------------+

使用上面的示例,我希望查询返回两行(每个组一个),第1组(第1行)为member_count = 2,第2组(第2行)为member_count = 0 。当前,由于member_count存在/不为null,它仅为组1返回单个。它不返回第2组的数据,因为group_memberships中没有第2组的记录以满足COUNT()。

user_groups.user_permissions_id为NULL时也会发生相同的问题,如果该组具有成员并且该组设置了user_permission_id,它将仅返回一个组记录。

1 个答案:

答案 0 :(得分:1)

您对Correlated subqueries的使用是错误的。另外,要获取成员数,您无需使用Subquery;您可以将<html> <head> </head> <body> <button type='button' onClick='example()'>Click me</button> <script src='Scripts/examplefile.js></script> </body> </html> Group by一起使用。

尝试:

Count()