我需要像这样加入2个查询
SELECT * from contracts join customers on customer.id=contracts.customer
和(12234是解释客户)
SELECT *,sum(cast(amount as UNSIGNED)) as total FROM(
SELECT * from invoices
where customer='123456'
UNION
SELECT * from paypal_invoices
where customer='123456') t1
在第一个查询中,我只是根据我们拥有的活动合约提取普通客户列表。
在第二部分中,我提取特定客户的任何发票总和
所以我基本上需要像第一个查询一样提取所有客户,但我还需要一个列,其中包含此特定客户的所有发票总和。 谢谢。
答案 0 :(得分:2)
一种方法是相关子查询或left join
s:
select co.*, cu.*, i.amount, pi.amount as paypal_amount,
( coalesce(i.amount, 0) + coalesce(pi.amount, 0) ) as total
from contracts co join
customers cu
on cu.id = co.customer left join
(select customer, sum(amount) as amount
from invoices
group by customer
) i
on i.customer = cu.id left join
(select customer, sum(amount) as amount
from paypal_invoices
group by customer
) pi
on pi.customer = cu.id;
这里有两个关键点。首先,确保在进行连接之前进行聚合。这可以防止连接乘以行数并生成不正确的结果。同样,这会使用LEFT JOIN
来确保包含所有客户,即使是那些没有发票的客户。
第二个想法:不要使用UNION
。实际上,您的查询可能不正确。 UNION
删除重复项 - 包括表内和表之间。使用UNION ALL
更安全。或者,在这种情况下,根本不需要它。