2011-12-15 111 views
0

我们有三张桌子。在MySQL中查询多于2个包含1个键的表?

1) Product_Table

Product_ID 
Product_Name 

2) Warehouse1_Table

Product_ID 
Inventory1 

3) Warehouse2_Table

Product_ID 
Inventory2 


产品ID可能不在Warehouse1_Table或Warehouse2_Table中,或者两者都存在

我试图找出一个查询这给了我们这样的:

Product_ID, Product_Name, TotalStock 

TotalStock是Inventory1 + Inventory2如果PRODUCT_ID既是表所示。
TotalStock是Inventory1如果PRODUCT_ID是Warehouse1_Table
TotalStock是Inventory2如果PRODUCT_ID是Warehouse2_Table
TotalStock是0,如果PRODUCT_ID没有任何仓库表

回答

1

尝试使用LEFT JOIN,这是一个加入该没有按”如果你的交叉表没有产生匹配,那么不会打断你的查询。再总结的库存,像这样:

SELECT p.Product_ID, p.Product_Name, 
(IFNULL(w1.Inventory1, 0) + ISNULL(w2.Inventory2, 0)) AS TotalStock 
FROM `Product_Table` AS p 
LEFT JOIN `Warehouse1_Table` AS w1 ON (
    p.Product_ID = w1.Product_ID 
) LEFT JOIN `Warehouse2_Table` AS w2 ON (
    p.Product_ID = w2.Product_ID 
); 

那么你的结果集应包含两种组合股票或仓库的任何一个返回的股票“TotalStock”字段。

+1

`NULL + 3 = NULL` =>你需要'IFNULL(w1.Inventory1,0)+ ISNULL(w2.Inventory2,0)` – MatBailie 2011-12-15 08:38:21

+0

@Dems你是对的,更新的例子。谢谢。 – Oldskool 2011-12-15 08:40:13

+0

这假定每个仓库表中的product_id都是唯一的(这是OP所暗示的,但未说明)。+1 – MatBailie 2011-12-15 08:44:42

2

这样的事情可能会奏效。我已经添加了一些样本数据来说明什么,我在得到:

create table Product_table 
(Product_ID int unsigned primary key,Product_Name varchar(50) not null, 
UNIQUE KEY `Product_TableUIdx1` (Product_Name)); 

create table Warehouse1_Table 
(Product_ID int unsigned not null,Inventory1 int, 
UNIQUE KEY `Warehouse1_Table_UIdx1` (Product_Id)); 

create table Warehouse2_Table 
(Product_ID int unsigned,Inventory2 int, 
UNIQUE KEY `Warehouse2_Table_UIdx1` (Product_Id)); 

insert into Product_table values (1,"Banana"); 
insert into Product_table values (2,"Apple"); 
insert into Product_table values (3,"Pear"); 
insert into Product_table values (4,"Orange"); 

insert into Warehouse1_Table values (1,2); 

insert into Warehouse2_Table values (3,10); 
insert into Warehouse2_Table values (4,5); 
insert into Warehouse2_Table values (1,3); 

select pt.Product_ID,pt.Product_Name, 
ifnull(wt1.Inventory1,0)+ifnull(wt2.Inventory2,0) as StockTotal 
from Product_table pt 
left outer join Warehouse1_Table wt1 on wt1.Product_ID = pt.Product_ID 
left outer join Warehouse2_Table wt2 on wt2.Product_ID = pt.Product_ID; 

由于民主党的鹰的眼睛指出,重要的是避免在同一PRODUCT_ID多行所产生的重复是很重要的两种Warehouse1_Table或Warehouse1_Table。如果添加唯一键在上面DDL是不可能的,那么你可以解决使用(有点丑陋)这样的查询:

select pt.Product_ID,pt.Product_Name, 
ifnull(wt1.Inventory1Total,0)+ifnull(wt2.Inventory2Total,0) as StockTotal 
from Product_table pt 
left outer join (select w1.Product_ID,sum(w1.Inventory1) as Inventory1Total 
from Warehouse1_Table w1 group by w1.Product_ID) as wt1 on wt1.Product_ID = pt.Product_ID 
left outer join (select w2.Product_ID,sum(w2.Inventory2) as Inventory2Total 
from Warehouse2_Table w2 group by w2.Product_ID) as wt2 on wt2.Product_ID = pt.Product_ID; 
0
SELECT Product_ID, 
     Product_Name, 
     SUM(w1.Inventory1) as sum1, 
     SUM(w2.Inventroy2) as sum2   

FROM Product_Table p 
LEFT JOIN Warehouse1_Table w1 ON p.Product_ID = w1.Product_ID 
LEFT JOIN Warehouse2_Table w2 ON p.Product_ID = w2.Product_ID 
GROUP BY p.Product_ID 

我没有测试过,但是这就是这个想法。

0
SELECT Product_ID, Product_Name, 
     Inventory1 + Inventory2 AS TotalStock 
    FROM Product_Table 
     NATURAL JOIN Warehouse1_Table 
     NATURAL JOIN Warehouse2_Table 
UNION 
SELECT Product_ID, Product_Name, 
     Inventory1 AS TotalStock 
    FROM Product_Table 
     NATURAL JOIN Warehouse1_Table 
WHERE Product_ID NOT IN (
          SELECT Product_ID 
          FROM Warehouse2_Table 
         ) 
UNION 
SELECT Product_ID, Product_Name, 
     Inventory2 AS TotalStock 
    FROM Product_Table 
     NATURAL JOIN Warehouse2_Table 
WHERE Product_ID NOT IN (
          SELECT Product_ID 
          FROM Warehouse1_Table 
         ) 
UNION 
SELECT Product_ID, Product_Name, 
     0 AS TotalStock 
    FROM Product_Table 
WHERE Product_ID NOT IN (
          SELECT Product_ID 
          FROM Warehouse1_Table 
         ) 
     AND Product_ID NOT IN (
           SELECT Product_ID 
           FROM Warehouse2_Table 
          );