2015-09-26 160 views
0

我需要編寫一個查詢來加入3個表。查詢加入3個表

我的表是:

ucommerce_customer

ucommerce_order

ucommerce_order_line

所有3個表有一個名爲ORDER_ID列。

表ucommerce_order有一個名爲order_status的列。

當order_status設置爲「打開」時,我想顯示訂單詳細信息。

ResultSet myRs = myStmt.executeQuery 
("SELECT * FROM ucommerce_customer 
INNER JOIN ucommerce_order 
INNER JOIN ucommerce_order_line 
WHERE ucommerce_order.order_status = 'open'"); 

我的查詢忽略了訂單狀態並顯示所有訂單,打開和關閉。

另外我有幾個產品,所以ucommerce_order_line有幾個條目爲同一個order_id,我的查詢顯示重複的條目,它也複製整個列表。

我該如何編寫一個只顯示未定單而不復制所有內容的查詢?

+0

https://dev.mysql.com/doc/refman/5.0/en/join.html並閱讀處理'JOIN ... ON ...'的部分 –

回答

0

在MySQL中,on/using子句是可選被移除。這是非常難過的,因爲有人可以像你一樣犯錯誤。你的問題只提到一列,或許這是所有所需join

SELECT * 
FROM ucommerce_customer INNER JOIN 
    ucommerce_order 
    USING (orderId) INNER JOIN 
    ucommerce_order_line 
    USING (OrderId) 
WHERE ucommerce_order.order_status = 'open'; 

我會感到驚訝,如果客戶表確實有一個名爲OrderId列(好像在大多數情況下是一個壞主意) ,所以第一個USING子句可能要使用CustomerId

+0

我將表ucommerce_customer設置爲自動遞增order_id。當我設置數據庫時,我只是爲了訂單而創建了這3個表格。我重新編寫客戶表中的客戶信息。我試過你的查詢,它幾乎在那裏。我收到了ucommerce_order_line表中每個條目的所有信息。 –

+0

@DaleWahl。 。 。這就是SQL的工作原理。它重複每一行的所有信息。你還應該用你真正需要的列替換SELECT *。 –

+0

有沒有辦法隔離ucommerce_order_line,以便其他表不會重複ucommerce_order_line中每個條目的信息?我對ucommerce_order_line中的每個商品使用order_id,因此訂單ID#244可能在ucommerce中發生5次或更多次。 –

0

我會建議使用自然連接。也許這就是錯誤來自的地方。

的重複可以通過運行SELECT DISTINCT * ...

+0

DISTINCT在我運行時不會執行任何操作查詢。它似乎忽略它就像忽略了我的WHERE命令。我的查詢實際上覆制了18次顯示的項目。 –

+0

您能否提供一些數據或正在運行的示例? – mihovale

+0

'天然連接'是非常危險的,應該避免。 –