我有两张表groups
和group_members
groups
的列srno
之一是整数,是主键
group_members
列group_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
)。
知道为什么会发生这种情况并且这是正确的方法吗?
答案 0 :(得分:1)
除了不必要的DISTICT
这个查询完全没问题。对于MySQL Detection of Functional Dependence,它甚至可以使用ONLY_FULL_GROUP_BY
模式。
您需要第二个连接以根据每个组中的成员数生成要计数的正确行数。无需在SELECT子句中引用grpmembrs2
的任何列。但如果您愿意,可以使用COUNT(grpmembrs2.group_srno)
。只要它不包含任何NULL,用于COUNT()
的列就没有关系。您也可以使用COUNT(*)
并让优化程序决定使用哪个列。