2010-03-11 88 views
1

装运我有三个表找到最近的一个产品(SQL子查询?)

shipment (shipment_id, shipping_date) 
company_order (company_order_id, shipment_id, company_id) 
company_order_item (company_order_item_id, company_order_id, product_id) 

一些企业扎堆从单一的制造商总订单。这个总计订单被称为“发货”。公司为每批货物选择一种产品:因此,并非所有产品都会出现在任何一批货物或任何一家公司中。

如何编写SQL查询查找每个product_id的最新货件?

我看过 SQL Query - Get Most Recent Revision(更简单的情况)。

回答

1

你需要让每个产品ID的最大出货日期,然后取回货物detaisl

喜欢的东西

SELECT * 
FROM (
      SELECT coi.product_id, 
        MAX(s.shipping_date) MaxDate 
      FROM company_order_item coi INNER JOIN 
        company_order co ON coi.company_order_id = co.company_order_id INNER JOIN 
        shipment s ON co.shipment_id =s.shipment_id 
      GROUP BY coi.product_id 
     ) sub INNER JOIN 
     company_order_item coi ON sub.product_id = coi.product_id INNER JOIN 
     company_order co ON coi.company_order_id = co.company_order_id INNER JOIN 
     shipment s ON co.shipment_id = s.shipment_id 
        AND s.shipping_date = sub.MaxDate 
+1

辉煌!正是我需要的。我花了好几个小时试图搞定这个:没意识到你可以做这样的子选择。非常感谢。 – Steve 2010-03-12 07:35:30

0

SQL代码来说明 - (这是T-SQL是SQL Server的友好,但我没有任何mysql方便,最后一个查询应该做一些细微的修改(以适应你的表名),在MySQL中也可以很好地工作。

我的逻辑是为每个product_id找到最近的company_order。我有我可以加入公司ny_order_id到company_order,并且我有每个product_id的每个最近c​​ompany_order的shipment_id

DROP TABLE #shipment 
DROP TABLE #company_order 
DROP TABLE #company_order_item 
CREATE TABLE #shipment 
    (
     shipment_id INT , 
     shipping_date INT 
    ) ; 
CREATE TABLE #company_order 
    (
     company_order_id INT , 
     shipment_id INT , 
     company_id INT 
    ) ; 
CREATE TABLE #company_order_item 
    (
     company_order_item_id INT , 
     company_order_id INT , 
     product_id INT 
    ) ; 

INSERT INTO #shipment 
     (shipment_id , shipping_date) 
VALUES 
     (1 , 1), 
     (2 , 2), 
     (3 , 3) 

INSERT INTO #company_order 
     (company_order_id , shipment_id , company_id) 
VALUES 
     (1 , 1 , 1), 
     (2 , 2 , 1), 
     (3 , 3 , 1) 

INSERT INTO #company_order_item 
     (company_order_item_id , company_order_id , product_id) 
VALUES 
     (1 , 1 , 1)  , 
     (2 , 1 , 2), 
     (2 , 2 , 2), 
     (1 , 1 , 3), 
     (1 , 3 , 4) 

SELECT 
    product_id , 
    shipment_id 
FROM 
    (
     SELECT 
     product_id , 
     MAX(company_order_id) AS company_order_id 
     FROM 
     #company_order_item 
     GROUP BY 
     product_id 
    ) AS MostRecentProductInOrder 
INNER JOIN #company_order 
ON MostRecentProductInOrder.company_order_id = #company_order.company_order_id 
+0

实际上只是忽略这一个,因为它应用了不同的逻辑;) - 每个产品id的most-recent-order_id - 因此找到那个货件。如果你的订单混在一起(更高的ID与更低的日期),这根本不起作用。 – cairnz 2010-03-11 08:36:50