1

テーブルの説明:

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」の最後の列に「THINGS」の合計を持つ各「MEMBER」の「MEMBERSHIP」を表示するテーブル/ビューを取得したいと考えました。

ロジックは次のとおりです。「MEMBERS」はレコードごとに 1 つのメンバーであり、各「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
4

2 に答える 2

0

私が実験していたとき、サブクエリを必要としない別の回避策を見つけました。これは、同様のシナリオで 100% 役立ちます。

次のように計算されているselectに列を追加しました:

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

そして、ほら、それは動作します:)

于 2013-03-18T09:07:17.237 に答える
0

正しい結果を得るには、個別のサブクエリで各レコードを計算する必要があります。テーブルを結合して直接計算すると、テーブルに複数のレコードとテーブルにmembers複数のレコードがある可能性があるため、無効な結果が得られます。membershipthingsThings

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
于 2013-03-18T08:20:50.120 に答える