2015-12-02 124 views
1

another question類似的問題除了我擁有的三個表是分層的而不是兩個並排的表。通過三個表的mysql連接

我有表是

我的頂級客戶表

id | name 
1 | alan 
2 | bob 
3 | charlie 

我的2級發票表

id | client_id | paid 
1 | 1   | 0 
2 | 1   | 1 
3 | 2   | 1 

我的第3級服務表

id | invoice_id | amount 
1 | 1   | 5.00 
2 | 1   | 10.00 
3 | 2   | 5.00 
4 | 3   | 10.00 

和我的德首創的結果是

id | name | amount_owing | amount_paid 
1 | alan | 15.00  | 5.00 
2 | bob  | null   | 10.00 
3 | charlie | null   | null 

我能得到這並不考慮他們是否支付某事或不

SELECT 
    clients.email, 
    jnt.* 
FROM clients 
LEFT JOIN (
    SELECT 
     invoices.client_id, 
     SUM(amount) AS invoice_total_paid 
    FROM 
     invoices, 
     services 
    WHERE 
     invoices.id = services.invoice_id 
    GROUP BY 
     invoices.client_id 
) AS jnt ON clients.id = jnt.client_id 

這給了我

id | name | client_id | invoice_total 
1 | alan | 1   | 20.00 
2 | bob  | 2   | 10.00 
3 | charlie | 3   | null 

,但它不劃分是否發票是否已付清(以及隨後的付款和欠款總額)。任何幫助非常讚賞

+1

你的SQL語句似乎不完整。添加到問題時是否存在複製/粘貼錯字? – War10ck

回答

3

你可以使用條件聚集預期的結果:

SELECT c.id, c.name, 
     SUM(CASE WHEN i.paid = 0 THEN s.amount ELSE 0 END) AS amount_owing, 
     SUM(CASE WHEN i.paid = 1 THEN s.amount ELSE 0 END) AS amount_paid 
FROM clients AS c 
LEFT JOIN invoices AS i ON c.id = i.client_id 
LEFT JOIN services AS s ON i.id = s.invoice_id 
GROUP BY c.id, c.name 

Demo here

0

你需要像

... 
SUM(IF(paid=1,amount,0)) AS amount_paid, 
SUM(IF(paid=0,0,amount)) AS amount_owning 
...