MySQL:获取组列表及其总成员数
Posted
技术标签:
【中文标题】MySQL:获取组列表及其总成员数【英文标题】:MySQL: Getting list of groups with their total member count 【发布时间】:2017-04-04 16:25:12 【问题描述】:我有两张桌子groups
和group_members
groups
具有 srno
列之一,它是整数并且是主键
group_members
具有列group_srno
,这是映射到表groups
的srno
的外键
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
是一个成员。在同一个查询中,我还希望获得每个列出的组拥有的成员总数。
所以我的代码正在运行这个查询(例如,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
)。
知道为什么会发生这种情况吗?这是正确的方法吗?
【问题讨论】:
请更新您的问题添加适当的数据样本和预期结果 将DISTINCT
与GROUP BY
一起使用看起来很可疑并且可能没有必要。请给我们一些数据。
好的,我会在一段时间内用一些数据更新这个问题。谢谢!
此查询不遵循 SQL Ansi 定义,即选择列表中的所有列必须按部分分组。只有 mysql 允许这种丑陋的东西,这可能会导致您的问题。加入 grpmembrs2
毫无用处,如果你把它拿出来并给你带来错误的结果,那么你的查询从一开始就是错误的。
@JorgeCampos 我认为不必要的第二次加入和不同的选择在某种程度上相互抵消了。只是我的预感。
【参考方案1】:
除了不必要的DISTICT
,这个查询完全没问题。对于 MySQLs Detection of Functional Dependence,它甚至可以在 ONLY_FULL_GROUP_BY
模式下工作。
您需要第二个连接来生成您想要根据每个组中的成员数计算的正确行数。不需要在 SELECT 子句中引用 grpmembrs2
的任何列。但如果你愿意,你可以使用COUNT(grpmembrs2.group_srno)
。只要不包含任何 NULL,您将哪个列用于 COUNT()
都没有关系。您也可以只使用COUNT(*)
,让优化器决定使用哪一列。
【讨论】:
以上是关于MySQL:获取组列表及其总成员数的主要内容,如果未能解决你的问题,请参考以下文章