MySql中的Count By Count(用户和组)

时间:2013-04-26 00:24:53

标签: php mysql sql

我正在创建一个社交移动应用程序,其中包含组和组可以拥有用户。我正在尝试编写一个查询,以便获取所有组以及其中的用户数。

注意:群组也可以有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个用户也显示所有组。

4 个答案:

答案 0 :(得分:1)

你应该从groups

中对它们进行分组
GROUP BY g.group_id

答案 1 :(得分:1)

使用SELECT *和GROUP BY是MySQL的憎恶。在您的情况下,由于imagelocation似乎与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