【问题标题】:MySQL: Getting list of groups with their total member countMySQL:获取组列表及其总成员数
【发布时间】:2017-04-04 16:25:12
【问题描述】:

我有两张桌子groupsgroup_members

groups 具有 srno 列之一,它是整数并且是主键

group_members 具有列group_srno,这是映射到表groupssrno 的外键

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)。

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

【问题讨论】:

  • 请更新您的问题添加适当的数据样本和预期结果
  • DISTINCTGROUP BY 一起使用看起来很可疑并且可能没有必要。请给我们一些数据。
  • 好的,我会在一段时间内用一些数据更新这个问题。谢谢!
  • 此查询不遵循 SQL Ansi 定义,即选择列表中的所有列必须按部分分组。只有 MySql 允许这种丑陋的东西,这可能会导致您的问题。加入 grpmembrs2 毫无用处,如果你把它拿出来并给你带来错误的结果,那么你的查询从一开始就是错误的。
  • @JorgeCampos 我认为不必要的第二次加入和不同的选择在某种程度上相互抵消了。只是我的预感。

标签: mysql sql


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-06-05
    • 2011-05-26
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多