SQL使用count连接多个表

时间:2013-03-18 08:15:08

标签: mysql sql join

表格说明:

Table Members:
  id
  name
  status

Table Memberships:
  id
  date_start
  date_end
  date_added
  cost
  member_id
  status
  membership_type

Table Things:
  id
  name
  quantity
  member_id
  status

通过以下查询,我希望得到的表/视图会为每个“会员”显示“会员”,每个“会员”在每个“会员”的最后一栏中都有“THINGS”总和。

逻辑是这样的:“成员”是每个记录一个成员,每个“成员”可以有多个“成员”,每个“成员”可以有多个“成就”记录。

但是,以下查询会返回事物数量的总和乘以每个用户拥有的成员数量。

  select
  memberships.id,
  memberships.member_id,
  members.name,
  members.status,
  memberships.membership_type,
  memberships.date_start,
  memberships.date_end,
  memberships.date_added,
  memberships.cost,
  memberships.status
  sum(things.quantity) as quantity
  from memberships
  right join members on memberships.member_id = members.id
  right join things on things.member_id = members.id
  where NOW() between memberships.date_start and memberships.date_end
  and memberships.status = 1
  and things.status = 1
  and members.status = 1
  group by members.id, memberships.member_id

2 个答案:

答案 0 :(得分:0)

您需要在单独的子查询上计算每个记录,以便您获得正确的结果。如果您加入表并直接计算,则结果无效,因为members可以在membership表上有多个记录,在things表上有多个Things。< / p>

SELECT  a.*,
        COALESCE(b.totalMembership, 0) totalMembership,
        COALESCE(c.TotalThings, 0) TotalThings
FROM    Members a
        LEFT JOIN
        (
            SELECT  member_id, COUNT(*) totalMembership
            FROM    Memberships 
            GROUP   BY member_ID
        ) b ON a.ID = b.member_ID
        LEFT JOIN 
        (
            SELECT  member_ID, SUM(quantity) TotalThings
            FROM    Things
            GROUP   BY member_ID
        ) c ON a.ID = c.member_ID

答案 1 :(得分:0)

在我进行实验的过程中,我发现了另一种不需要子查询的工作,它对于类似的场景非常有用。

我刚刚在select中添加了一个列,如下所示:

(sum(things.quantity) DIV count(distinct memberships.id)) as quantity

而且,瞧,它有效:)

相关问题