代码之家  ›  专栏  ›  技术社区  ›  Marcus Thornton

如果表很大,如何按组求和

sql
  •  -1
  • Marcus Thornton  · 技术社区  · 8 年前

    我想把家里花的钱加起来。

    我有两张桌子。

    • 会员表(会员ID,消费金额)
    • 家庭餐桌(家庭身份证、会员身份证、家庭消费金额)
      • 家庭与成员的关系,一个家庭有许多成员,但一个成员属于一个家庭。

    我想得到家庭证,并按金额订购。

    两张桌子都很大,会员桌两倍大。我该怎么把数字加起来,然后再分组呢?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Kamil Gosciminski    8 年前

    一般来说你需要简单 LEFT JOIN 分组和求和。

    select h.household_id, coalesce(sum(m.money_spend),0) as sum_of_money_spent
    from household h
    left join member m on h.member_id = m.member_id
    group by h.household_id
    

    不过,如果一个家庭有很多成员,但每个成员只有一个家庭,请通读你的关系描述 我们有1:N的关系 你应该坚持住 household_id 价值在 member 表。

    如果我理解正确的话,似乎你已经实现了与一个关联实体之间的n:n关系,而实际上还有一个表保存着每个家庭的信息。

    注意,使用适当的数据架构,您将在一个表中拥有所需的所有信息,并且不需要额外的连接,除非您想提取每个家庭的一些细节,比如他们的地址。

        2
  •  2
  •   Tim Biegeleisen    8 年前

    我想 GROUP BY 这是一个明智的选择,但是,没有太多的优化空间:

    SELECT
        h.household_id,
        COALESCE(SUM(m.money_spend), 0) AS total
    FROM Household h
    LEFT JOIN Member m
        ON h.member_id = m.member_id
    GROUP BY
        h.household_id;
    

    我真的不想键入那个查询,但我这样做只是为了指出聚合实际上需要潜在地接触 Household 和 Member 桌子.原因是,我们不知道一个家庭的总开支,直到我们统计了每个成员,因此每个成员的记录。

    因为我们是从 家庭 ,我们正在扫描此表,并在 member_id 联接列应该没有多大区别。同样地, 会员身份证 可能是 成员 表。因此,我不希望索引在连接中起作用,而且索引在聚合中也不会有太大的作用。