2013-04-26 25 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