2015-09-26 158 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

'天然连接'是非常危险的,应该避免。 –