Запросить больше, чем 2 таблицы с 1 ключом в MySQL? - PullRequest
0 голосов
/ 15 декабря 2011

У нас есть три стола.

1) Product_Table

Product_ID
Product_Name

2) Warehouse1_Table

Product_ID
Inventory1

3) Warehouse2_Table

Product_ID
Inventory2


Идентификатор продукта может отсутствовать в Warehouse1_Table или Warehouse2_Table или в обоих .

Я пытаюсь выяснить один запрос, который дает нам что-то вроде этого:

Product_ID, Product_Name, TotalStock

TotalStock is Inventory1 + Inventory2, если Product_ID находится в обеих таблицах.
TotalStock is Inventory1, если Product_ID находится в Warehouse1_Table
TotalStock is Inventory2, если Product_ID находится в Warehouse2_Table
TotalStock = 0, если Product_ID отсутствует ни в одной из таблиц Warehouse

Ответы [ 4 ]

2 голосов
/ 15 декабря 2011

Нечто подобное может работать.Я добавил несколько примеров данных, чтобы проиллюстрировать, к чему я стремлюсь:

 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;
1 голос
/ 15 декабря 2011

Попробуйте использовать 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' с объединенным запасом или запасом, который вернул один из складов.

0 голосов
/ 15 декабря 2011
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
                             );
0 голосов
/ 15 декабря 2011
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

Я не проверял, но это идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...