表格说明:
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
答案 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
而且,瞧,它有效:)