我正在创建一个社交移动应用程序,其中包含组和组可以拥有用户。我正在尝试编写一个查询,以便获取所有组以及其中的用户数。
注意:群组也可以有0个用户。
即使群组没有用户,我仍然需要获取其信息。我该怎么办?我试过了:
Select *, count(ug.group_id) from groups g
left join images i ON(g.group_image_id = i.image_id)
left join location l ON(g.group_location_id = l.location_id)
.
.
left join user_group ug on(ug.gorup_id = g.group_id)
group by ug.group_id;
现在,此查询不会为我提供零用户的组。如何更改它,以便即使组有0个用户也显示所有组。
答案 0 :(得分:1)
你应该从groups
表
GROUP BY g.group_id
答案 1 :(得分:1)
使用SELECT *和GROUP BY是MySQL的憎恶。在您的情况下,由于image
和location
似乎与group
之间存在 0:1 关系,因此看起来并不痛。这只是非常糟糕的做法。
这是一种符合ANSI标准的编写查询的方法。如果您想要从几个表加上计数的完整结果集,那么只需将计数部分添加为表达式。
Select *, (select count(ug.group_id)
from user_group ug
where ug.gorup_id = g.group_id) GroupUserCount
from groups g
left join images i ON(g.group_image_id = i.image_id)
left join location l ON(g.group_location_id = l.location_id)
.
.
答案 2 :(得分:0)
我相信你正在寻找类似的东西:
Select g.group_id,coalesce(users ,0)
from groups g
left join (select ug.gorup_id,count(*) users
from user_group ug
group by ug.gorup_id) s
on s.group_id = g.group_id
如果您只需要知道用户组和用户数,则不需要示例中的其他表。
答案 3 :(得分:0)
您正在按左连接的列进行分组,这意味着当一个组没有用户时,您的分组为空。
您需要按groups表的id进行分组,count(*)将计算已连接行的数量。
然后使用左连接添加空组,其中连接行为空
Select g.group_id as groupId, count(*) as nb
from groups g
join user_group ug on (ug.group_id = g.group_id)
group by g.group_id
UNION ALL
Select g.group_id as groupId, 0 as nb
from groups g
left join user_group ug on (ug.group_id = g.group_id)
where ug.group_id is null
group by g.group_id
[编辑]一个查询计数在select语句中查找空连接,如果找到则将nb设置为0
Select g.group_id as groupId, IF(ug.group_id is null, 0,count(*)) as nb
from groups g
left join user_group ug on (ug.group_id = g.group_id)
group by g.group_id