簡體   English   中英

SQL連接多個表與計數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM