2013-01-21 87 views
0

我想看看客户从给定的制造商订购什么。如何在MySQL中连接多个表?

我有论文表(含列):

  • 项目(item_num,order_num,stock_num,manu_code,数量等)
  • 股票(stock_num,manu_code描述,unit_price等)
  • 订单(order_num,order_date,CUSTOMER_NUM,ship_instruct等)
  • 客户(CUSTOMER_NUM,FNAME,LNAME,公司,地址1等)

这是我的查询的权利,但我相信这是返回一个跨某种产品:

SELECT concat(c.fname," ", c.lname) AS fullname, s.description 
FROM items i, stock s, customer c JOIN orders o 
ON o.customer_num=c.customer_num 
WHERE o.order_num=i.order_num AND i.manu_code = 'ANZ'; 

它会返回大量重复entires的大名单(1000线),

Anthony Higgens | baseball gloves 
Anthony Higgens | baseball gloves 
     .     . 
     .     . 
     .     . 
Kim Satifer  | running shoes 

我在做什么错?

+0

尝试通过该项目的ID或任何你分组需要。 – Shomz

回答

0

试试这个:

SELECT DISTINCT concat(c.fname," ", c.lname) AS fullname, s.description 
FROM customer c 
INNER JOIN orders o ON c.customer_num = o.customer_num 
INNER JOIN items i ON o.order_num = i.order_num 
INNER JOIN stock s on s.stock_num = i.stock_num 
WHERE i.manu_code = 'ANZ' 
+0

这会返回太多的行。我只注意到物品和库存都有一个stock_num字段,并将最后一个INNER JOIN更改为:INNER JOIN stock s on s.stock_num = i.stock_num – broinjc

+0

SELECT DISTINCT concat(c.fname,“”,c.lname)作为全名, s.description FROM customer c INNER JOIN订单o ON c.customer_num = o。customer_num INNER JOIN items i ON o.order_num = i.order_num INNER JOIN股票s on.stock_num = i.stock_num WHERE i.manu_code ='ANZ'; – broinjc

+0

@broinjc:是的,你是对的...我没有注意到那个领域...谢谢 – Marco

1

FROM items i, stock s, customer c确实参与了这三个表的笛卡尔连接,但您的WHERE对该笛卡尔连接做的限制很少。

如果你做了一些更明确的加入,你会明白减少重复,更正确地表达你正在做的事情。使用INNER JOINS和正确的连接标准,而不是仅列出FROM之后的所有表。例如:(还有更多这样的标准,您需要应用到JOINS,但这只是一个示例):INNER JOIN stock ON stack.manu_code = items.manu_code

最后,您可以使用SELECT DISTINCTGROUP BY来进一步减少重复。但是,如果您使用JOIN标准获得明确的JOIN,则不应该有太多重复项。

+0

当我做一个GROUP BY全名时,它会显示客户订购了'ANZ'产品,但所有的描述都是'网球拍'。我如何连接他们订购的产品的描述? – broinjc

+0

尝试使用'GROUP_CONCAT'。 – DWright

0

这应该工作:

 

     SELECT   concat(a.fname, " ", a.lname) as name 
         , d.description as desc 
     FROM   CUSTOMER a 
     INNER JOIN  ORDERS  b 
      on   a.customer_num = b.customer_num 
     INNER JOIN  ITEMS  c 
      on   b.order_num = c.order_num 
     INNER JOIN  STOCK  d 
      on   c.manu_code = d.manu_code 
     where   c.manu_code like 'ANZ' 
     group by  name,desc 

0

谢谢大家,我觉得这是现在的工作:

SELECT DISTINCT concat(c.fname," ", c.lname) AS fullname, s.description 
FROM customer c 
INNER JOIN orders o ON c.customer_num = o.customer_num 
INNER JOIN items i ON o.order_num = i.order_num 
INNER JOIN stock s on s.stock_num = i.stock_num 
WHERE i.manu_code = 'ANZ';