2011-08-08 76 views
1

我有一個連接表的問題,我還沒有設法解決。不知何故,我覺得它比我想象的更簡單。總之:MySQL多行加入

我有三個表:

訂單

orderlines

支付

在 「訂單」 每一行對應於一個客戶提出一個數量級。每個訂單都有一個order_id,它是該表的主鍵。在「訂單」中,我保留訂單的內容,即訂單上對產品和服務的引用。一個訂單可以並且通常具有很多訂單。最後,在付款方面,我爲每筆交易支付訂單時存儲一行。

理想情況下,一個訂單永遠不會有多個相應的付款行。但是因爲客戶是客戶,所以有人兩次支付相同的發票並不罕見,這暗示支付表可以爲一個訂單支付兩次或多次付款。

因此,創建一個以相關方式連接所有三個表的查詢會很有用,但我沒有設法這樣做。例如:

SELECT orders.order_id,SUM(orderlines.amount),SUM(payments.amount) FROM訂單 LEFT JOIN orderlines ON orders.order_id = orderlines.order_id LEFT JOIN付款 ON orders.order_id = payments.order_id GROUP BY orders.order_id

此連接的目的是查明訂單上的產品的SUM是否等於付款中的SUM。這裏的問題在於,兩張表付款和訂單行通過在加入時引起多行而「彼此分散」。

有沒有簡單的解決這個問題?

+0

這是因爲使用你的左連接。嘗試將第二個LEFT JOIN替換爲常規JOIN。 –

回答

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; 
2

也許我過於複雜的事情,但使用表格和生產總和將始終引領太錯結果,即一個訂單有10個訂單行和1個支付行=>付款金額將增加10次。我想你必須使用子查詢像下面這樣(你沒有從你的表「訂單」,但ID使用任何東西,所以我離開它,因爲所有的訂單都orderlines):

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 
+0

這似乎是正確的解決方案。根據OP的要求,可以通過在t2.PaymentAmount之後引入一個案例結構來直接返回結果集中的各種狀態(例如,多付): CASE WHEN t2.PaymentAmount = t1.OrderAmount THEN'all paid' WHEN t2 .PaymentAmount> t1.OrderAmount THEN'overpaid' ELSE'未全額付款' END等 – Jules

+0

這確實是上述簡化示例的一個非常好的解決方案。但是,如果我想要的東西提取不僅僅是SUM(量)從orderlines更多?那豈不是把服務器上的一個偉大的負載,使幾個子查詢在相同的SELECT語句? 嗯,我會因爲它解決我的問題繼續嘗試。非常感謝你! – Mattias

+0

如果您想了解更多的信息,然後SUM(金額),你可以將其添加到別名爲T1的查詢,並在外部查詢中引用它。它只有3個查詢,所以我想這是好的,特別是因爲他們是不相關的(評估每一行)。 – Jacob