我在加入我无法解决的表格时遇到问题。不知怎的,我的印象是它比我想象的要简单。总之:
我有三张桌子:
订单
orderlines
付款
在“订单”中,每一行对应一个客户订单。每个订单都有一个order_id,它是该表的主键。在“订单”中,我保留订单的内容,即订单上的产品和服务的引用。一个订单可以并且通常具有许多订单。最后,在付款时,我为每笔交易支付订单存储一行。
理想情况下,一个订单在付款中永远不会有多个相应的行。但由于客户是客户,因此有人支付相同的发票两次并不罕见,暗示付款表可以为一个订单支付两笔或更多笔款。
因此,创建一个以相关方式连接所有三个表的查询会很有用,但我还没有设法这样做。例如:
SELECT orders.order_id,SUM(orderlines.amount),SUM(payments.amount) 来自订单 LEFT JOIN订单 ON orders.order_id = orderlines.order_id LEFT JOIN付款 ON orders.order_id = payments.order_id GROUP BY orders.order_id
此联接的目的是确定订单上产品的总和是否等于付款中的SUM。这里的问题是,两个表支付和订单行在加入时会导致多行,从而“分散”彼此。
这个问题有一个简单的解决方案吗?
答案 0 :(得分:2)
也许我过于复杂化了,但是使用两个表并产生总和会导致错误的结果,即一个订单有10个订单行和1个支付行=>付款金额将增加10倍。我想你必须使用下面这样的子选择(你没有使用你的表“订单”中的任何东西,但id,所以我把它留了出来,因为所有订单都有订单线):
SELECT t1.order_id, t1.OrderAmount, t2.PaymentAmount
FROM (SELECT SUM(amount) AS OrderAmount, order_id
FROM orderlines
GROUP BY order_id) AS t1
LEFT JOIN (SELECT SUM(amount) AS PaymentAmount, order_id
FROM payments
GROUP BY order_id) AS t2
ON t1.order_id=t2.order_id
答案 1 :(得分:0)
我认为您要做的是获取所有项目的总和,以及所有付款的总和,然后将它们链接在一起。子选择能够做到这一点。
类似于:(ps我手头没有数据库,所以它可能不是有效的sql)
SELECT * FROM orders
LEFT JOIN (SELECT order_id, SUM(amount) FROM orderlines GROUP BY order_id) AS ordersums
ON orders.order_id = ordersums.order_id
LEFT JOIN (SELECT order_id, SUM(amount) FROM payments GROUP BY order_id) AS paymentsums
ON orders.order_id = paymentsums.order_id;