2015-12-02 123 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 
...