Найти самую последнюю поставку для продукта (sql subselect?) - PullRequest
1 голос
/ 11 марта 2010

У меня три таблицы

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-запрос - Получить последнюю версию (гораздо более простой случай).

Ответы [ 2 ]

1 голос
/ 11 марта 2010

Вам необходимо получить максимальную дату отгрузки для каждого идентификатора продукта, а затем получить данные об отправке

Что-то вроде

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
0 голосов
/ 11 марта 2010

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

Моя логика состоит в том, чтобы найти самый последний company_order для каждого product_id. Получив это, я могу просто присоединить company_order_id к company_order, и у меня есть shipment_id для каждого самого последнего company_order для product_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...