2013-04-26 94 views
0

我正在创建一个具有群组和群组可以拥有用户的社交移动应用程序。我正在尝试编写一个查询以获取所有组以及其中的用户数量。在MySql中按群计数(用户和群组)

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

回答

1

使用SELECT *和GROUP BY是MySQL的憎恶。在你的情况,它看起来并不像它受伤,因为imagelocation似乎有0:1group的关系。这只是非常糟糕的做法。

以下是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) 
. 
. 
+0

是的,是的,是的。 – Kermit 2013-04-26 02:05:31

1

groups

GROUP BY g.group_id 
+0

应该不鼓励这种'GROUP BY'的用法。 – Kermit 2013-04-26 02:05:14

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 

如果你只需要知道用户的组号码,对方表在这个例子中是没有必要的。

0

您正在按左连接的列进行分组,这意味着当一个组没有用户时,您将按空值分组。

您需要按组表编号进行分组,并且计数(*)将计算连接的行数。

然后添加使用左边的空组加入,并在那里参加行空

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