MySQL:获取总成员数为

时间:2017-04-04 16:25:12

标签: mysql sql

我有两张表groupsgroup_members

groups的列srno之一是整数,是主键

group_membersgroup_srno,其外键映射到表srno的{​​{1}}

groups有另一列group_members,它是整数

示例数据:

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的值为147258):

member_profile_srno

这会返回我预期的结果。

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;

我的意思是我让所有拥有147258成员的团体成为会员,并且还列出了每个团体的总成员数。

但是,我不确定为什么连接srno groupname grpmembrscount 1 firstgroup 3 3 thirdgroup 4 4 fourthgroup 2 在查询中不存在于任何地方。但是,如果我删除了该加入,则grpmembrs2无法获得正确的值(所有行都为grpmembrscount)。

知道为什么会发生这种情况并且这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

除了不必要的DISTICT这个查询完全没问题。对于MySQL Detection of Functional Dependence,它甚至可以使用ONLY_FULL_GROUP_BY模式。

您需要第二个连接以根据每个组中的成员数生成要计数的正确行数。无需在SELECT子句中引用grpmembrs2的任何列。但如果您愿意,可以使用COUNT(grpmembrs2.group_srno)。只要它不包含任何NULL,用于COUNT()的列就没有关系。您也可以使用COUNT(*)并让优化程序决定使用哪个列。