![](/img/trans.png)
[英]MySQL - continue selecting data from other tables when row in one table does not exist
[英]MySQL selecting everything from one table with sums from 2 other tables
我有3张桌子
发票: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
但所产生的金额已乘以每张发票的服务数量。
有没有办法通过一个查询提取所有数据?
您有两个子表,在各自的联接中返回的行数不同。 如果您在没有分组/求和的情况下运行查询,则最终结果是:
+------+-----------+-------+-----------+--------+
| 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 |
+------+-----------+-------+-----------+--------+
请注意,发票#1的付款金额$ 7和发票#2的服务价格是如何重复的。 MySQL试图通过复制表中行较少的值来填补查询结构产生的“漏洞”。
为了使这种查询有效,您需要使用相关的子查询,以便每个子查询都可以进行自己的求和,而不受其他表的行数限制的约束:
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 |
+------+---------------+----------------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.