1

私は3つのテーブルを持っています:

Project PurchaseA PurchaseB

プロジェクトのスキーマ:

id | user_id | title | description | create_date

PurchaseA のスキーマ:

id | project_id | amount | create_date

PurchaseB のスキーマ:

id | project_id | amount | create_date

Projectさまざまなプロジェクトを詳述する一意の行がたくさんあります。これらの各プロジェクトには、 と の両方に多くの行がPurchaseAありPurchaseBます。私がやりたいことはProject、フィールドidとからすべての行を選択することですが、 の関連レコードの合計とtitleの関連レコードの合計の両方の合計も選択します。PurchaseAPurchaseB

互いに独立して動作させることはできますが、結合が 2 つあると、数値が大幅に膨らんでしまいます。

望ましい結果

21732 Test Project A          84274.48
21747 Test Project B          18237.47
34714 Test Project C         183747.18

ここで、FLOATS を含む列は、PurchaseAとからの関連する行の合計ですPurchaseB

編集

これが私の現在のSQLです:

select 
    projects.id,
    projects.title,
    COALESCE(SUM(PurchaseA.amount), 0) as pledgetotal,
    COALESCE(SUM(PurchaseB.amount), 0) as purchasetotal
from
    projects
        left join
    PurchaseA ON (PurchaseA.project_id = projects.id)
        left join
    PurchaseB ON (PurchaseB.project_id = projects.id)
        left join

WHERE
    projects.title IS NOT NULL

    projects.end_date < NOW()
group by projects.id

テストデータ

Projects:

id          title           description         create_date

623         Test Project A  This is a test A    2013-01-01
624         Test Project B  This is a test B    2013-01-02


PurchaseA

id          project_id      amount              create_date
1           623             100                 2013-01-02
2           623             125                 2013-01-02
3           624             200                 2013-01-03
4           623             150                 2013-01-03
5           624             50                  2013-01-04

PurchaseB

id          project_id      amount              create_date
1           623             110                 2013-01-02
2           624             105                 2013-01-02
3           623             215                 2013-01-03
4           623             100                 2013-01-03
5           624             150                 2013-01-04

ご覧のとおり、各プロジェクトには、関連する各テーブルに複数の行があります。各テーブルから合計を取得し、それらを合計したいと思います。

4

2 に答える 2

1

projectsあなたの問題の一部は、テーブルとテーブルの間に存在する一対多の関係にあると思いますpurchase.。私の提案は、sum()サブクエリに移動することです:

select 
    p.id,
    p.title,
    a.pledgetotal,
    b.purchasetotal
from projects p
left join
(
  select project_id, sum(amount) pledgetotal
  from PurchaseA
  group by project_id
) a
  ON (a.project_id = p.id)
left join
( 
  select project_id, sum(amount) purchasetotal
  from PurchaseB
  group by project_id
) b
  ON (B.project_id = p.id)
WHERE p.title IS NOT NULL;

デモで SQL Fiddle を参照してください

于 2013-05-03T20:11:56.453 に答える
0

これを試すことができます(テストされていません):

SELECT a.id, a.title, (pa.amount+pb.amount)  AS TotalPurchase FROM Project a
    LEFT JOIN ( SELECT project_id, SUM(amount) AS amount FROM PurchaseA GROUP BY project_id ) pa
    ON pa.project_id = a.id
    LEFT JOIN ( SELECT project_id, SUM(amount) AS amount FROM PurchaseB GROUP BY project_id ) pb
    ON pb.project_id = a.id
于 2013-05-03T19:51:29.817 に答える