2010-03-11 1 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

Вы должны получить максимальную дату отгрузки на каждый идентификатор продукта, а затем получить отгрузки 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

0

SQL-кода для иллюстрации - (Это T-SQL и SQL Server дружественный , но у меня не было никакого mysql. Последний запрос должен с небольшими изменениями (в соответствии с вашими именами таблиц) хорошо работает и в MySQL.

Моей логикой является поиск новейшего company_order для каждого product_id. у меня есть, что я могу просто присоединиться к компа ny_order_id к company_order, и у меня есть shipment_id для каждой самой последней из последних версий company_order на продукт_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

На самом деле просто игнорируйте это, потому что он применяет другую логику;) - most-recent-order_id для каждого идентификатора продукта - таким образом, обнаруживая отгрузку для этого. Если ваши заказы входят во все смешанные (более высокие идентификаторы с более низкими датами), это не сработает вообще. – cairnz