0

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

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

4 回答 4

1

你应该把它们从groups表中分组

GROUP BY g.group_id
于 2013-04-26T00:26:57.257 回答
1

使用 SELECT * 和 GROUP BY 是 MySQL 的厌恶。在你的情况下,它看起来并不疼,因为它似乎与image0 :1关系。这只是非常糟糕的做法。locationgroup

这是编写查询的符合 ANSI 的方法。如果您想要 JOINing 几个表的完整结果集以及计数,则仅将计数部分添加为表达式。

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)
.
.
于 2013-04-26T01:35:14.580 回答
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

如果您只需要知道用户组和用户数,则不需要示例中的其他表。

于 2013-04-26T00:27:37.337 回答
0

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

您需要按组表的 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
于 2013-04-26T01:08:40.293 回答