2013-02-16 74 views
0

总和我有3个表MySQL的选择了从一个表与其他2个表

发票:ID,客户

服务:invioce_id,价格

付款:INVOICE_ID,量

我想要选择所有服务价格均为amountDue且任何付款金额为每张发票的amountPaid的所有发票。

因此,举例来说,如果我有以下行:

发票

id = 1, client = 232 
id = 2, client = 535 

服务

invoice_id = 1, price = 5.00 
invoice_id = 1, price = 10.00 
invoice_id = 2, price = 20.00 

支付

invoice_id = 1, amount = 7.00 
invoice_id = 2, amount = 12.00 
invoice_id = 2, amount = 8.00 

我想对所有发票结果查询行是这样的:

发票

id = 1, client = 232, amountDue = 15.00, amountPaid = 7.00 
id = 2, client = 535, amountDue = 20.00, amountPaid = 20.00 

我有这样的查询:

SELECT invoices.*, 
sum(services.price) AS amountDue, 
sum(payments.amount) AS amountPaid 
FROM invoices 
LEFT JOIN services ON services.invoice = invoices.id 
LEFT JOIN payments ON invoices.id = payments.invoice 
GROUP BY invoices.id 

但由此产生的amountPaid正在被服务的每个发票的数量成倍增加。

有没有办法用一个查询来提取所有数据?

回答

0

你有两个子表,它们各自的连接返回不同数量的行。如果没有分组/组合运行查询,你结束了:

+------+-----------+-------+-----------+--------+ 
| id | serviceid | price | paymentid | amount | 
+------+-----------+-------+-----------+--------+ 
| 1 |   1 | 5.00 |   1 | 7.00 | 
| 1 |   1 | 10.00 |   1 | 7.00 | 
| 2 |   2 | 20.00 |   2 | 12.00 | 
| 2 |   2 | 20.00 |   2 | 8.00 | 
+------+-----------+-------+-----------+--------+ 

注意如何支付的金额$ 7重复发票#1和服务价格的发票#2。 MySQL试图填充查询结构产生的“漏洞”,通过从具有较少行的表中复制值来填充。

对于这种类型的查询工作,你需要使用corelated子查询,使每个子查询可以做自己的总结,而不受其他表的行数限制的约束:

select invoices.id, 
    (select sum(price) from services where services.iid = invoices.id) AS service_price, 
    (select sum(amount) from payments where payments.iid = invoices.id) AS payment_amount 
FROM invoices; 

产生

+------+---------------+----------------+ 
| id | service_price | payment_amount | 
+------+---------------+----------------+ 
| 1 |   15.00 |   7.00 | 
| 2 |   20.00 |   20.00 | 
+------+---------------+----------------+ 
+0

谢谢!这工作。 – user1218595 2013-02-17 00:00:36

+0

是否有可能采取这一步,并只选择payment_amount user1218595 2013-02-17 00:01:25

+0

当然,只需在查询中添加'having'子句:'...从具有payment_amount 2013-02-17 03:12:42