[英]SQL joining multiple tables with count
表說明:
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
在下面的查詢中,我想獲取表/視圖,該表/視圖將為每個“ MEMBER”顯示“ MEMBERSHIP”,每個“ MEMBER”的最后一列中將包含“ THINGS”。
邏輯是這樣的:“ MEMBERS”是每個記錄的一個成員,每個“ MEMBER”可以有多個“ MEMBERSHIPS”,每個“ MEMBER”可以有多個“ 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
您需要在單獨的子查詢上計算每個記錄,以便獲得正確的結果。 如果您聯接表並直接對其進行計算,則結果將無效,因為members
可以在membership
表上具有多個記錄,也可以在Things
表上具有多個things
。
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
在進行實驗時,我發現了另一種不需要子查詢的方法,對於類似的情況它是100%有用的。
我只是在select中添加了這樣計算的列:
(sum(things.quantity) DIV count(distinct memberships.id)) as quantity
而且,它起作用了:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.