2017-04-04 23 views
0

我有兩個表groupsgroup_membersMySQL的:獲取組的列表與它們的總件數

groups具有列srno是整數之一,並且是主鍵

group_members具有是柱group_srno外鍵映射到表groups

group_memberssrno有另一列member_profile_srno其是整數

的樣本數據:

groups有行:

srno groupname 
1  firstgroup 
2  secondgroup 
3  thirdgroup 
4  fourthgroup 

group_members有行:

group_srno member_profile_srno 
1    147258 
1    132678 
1    551766 
2    347799 
2    556657 
3    147258 
3    365376 
3    576252 
3    682762 
4    147258 
4    465545 

我想從groups這給member_profile_srno列出所有行是其成員。在同一個查詢中,我也希望獲得列出的每個組成員的總數。

所以我的代碼運行該查詢(例如其中member_profile_srno值爲147258):

select distinct grps.*, 
     count(grpmembrs1.member_profile_srno) as grpmembrscount 
from groups as grps 
    inner join group_members as grpmembrs1 on grpmembrs1.group_srno = grps.srno 
    inner join group_members as grpmembrs2 on grpmembrs2.group_srno = grps.srno 
where grpmembrs1.member_profile_srno = 147258 
group by grps.srno; 

這將返回我預期的結果。

srno groupname  grpmembrscount 
1  firstgroup  3 
3  thirdgroup  4 
4  fourthgroup  2 

我的意思是我得到所有有147258作爲成員的組,並列出每個組的總成員數。

但是,我不確定爲什麼加入grpmembrs2存在於查詢中,當它沒有被引用時。但是,如果我刪除該聯接,則grpmembrscount不會得到正確的值(對於所有行,它是1)。

任何想法爲什麼會發生這種情況,這是正確的方法嗎?

+0

更新你的問題添加一個合適的數據樣本和預期的結果請 – scaisEdge

+1

DISTINCT與'GROUP BY'一起使用,因爲它看起來很可疑並且可能是不必要的。請向我們展示一些數據。 –

+0

好的,我會在一段時間內用一些數據更新這個問題。謝謝! – Atul

回答

1

除了不必要的DISTICT這個查詢是非常好的。與MySQL Detection of Functional Dependence它甚至應該與ONLY_FULL_GROUP_BY模式。

您需要第二次連接才能根據每個組中成員的數量生成要計數的正確行數。不需要在SELECT子句中引用grpmembrs2的任何列。但如果你想要的話,你可以使用COUNT(grpmembrs2.group_srno)。只要它不包含任何空值,那麼您使用哪個列爲COUNT()並不重要。您也可以使用COUNT(*)並讓優化器決定使用哪一列。

+0

非常感謝,讓這一切都清楚:) – Atul