2013-08-23 4 views
2

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

  OFFER         PRODUCTS 
ID  Number  Version   poID  offer_id  Product  how_many 
==========================   ======================================== 
1   123  1    1   1    Apple  1 
2   123  2    2   1    Banana  2 
3   124  1    3   1    Orange  1 
             4   2    Apple  1 
             5   2    Banana  2 
             6   2    Orange  2 
             7   2    Kiwi   1 
             8   3    Apple  2 
             9   3    Banana  3 

Я хотел бы список того, как много продуктов, которые в настоящее время предлагается. Так как OFFER (id = 2) - это обновление (id = 1) только (id = 2).

Как лучше всего задать вопрос?

+1

можете ли вы опубликовать желаемые результаты .. вопрос запутан. .. – StevieG

ответ

0
SELECT * 
FROM products 
WHERE offer_id = (SELECT MAX(id) FROM offer) 

или, если вы предпочитаете присоединиться синтаксис

SELECT p.* 
FROM products p 
INNER JOIN (SELECT MAX(id) id FROM offer) o ON p.offer_id = o.id 

Edit (еще не полностью уверен, что это то, что вы хотите, не видя желаемых результатов)

SELECT p.* 
FROM products p 
INNER JOIN offer o on p.offer_id = o.id 
INNER JOIN 
(SELECT number, max(version) 
FROM offer 
GROUP BY number 
) oMax ON o.number = oMax.number AND o.version = oMax.version 
+0

Это не вернет желаемый результат. –

+0

ваш подзапрос не дает правильного результата, он ищет 'id' с' MAX (версия) ' – NDM

+0

, может быть, я неправильно прочитал этот вопрос, но, как я понимаю, OP хочет все продукты с предложением_id = 3 Я полагаю, что это может быть истолковано, что он хочет, чтобы яблоко и банан были предложены 3, а киви и апельсин - из предложения 2, и в этом случае вы правы, он не вернет это. – StevieG

1

Прежде всего, необходимо получить все предложения для латтеров:

select o.id 
from offer o 
where version = (select max(version) 
       from offer o2 
       where o2.number = o.number); 

На основании выше, вы можете получить все продукты:

select p.* 
from products p 
where offer_id in (select o.id 
        from offer o 
        where version = (select max(version) 
            from offer o2 
            where o2.number = o.number)); 
0

If id и version коррелируют:

select sum(how_many) from products p 
join offer on p.offer_id=offer.id 
join (
    select number, max(version) version from offer group by number 
) x 
on offer.id=x.id and offer.version = x.version 
+0

Это будет работать только в том случае, если предложение с более высоким номером vesion также будет иметь более высокий идентификатор. –

+0

обычно задается такое ограничение. однако я обновил ответ – Chris

0

Попробуйте это:

select [list columns here] 
from products p 
join (select offernumber, max(id) as ID from offer group by offernumber) a 
    on a.id = p.offer_id 

Если вам нужно Addtional столбцы предложение, отличное от номера предложения и идентификатора:

select [list columns here] 
from products p 
join (select offernumber, max(id) as ID from offer group by offernumber) a 
    on a.id = p.offer_id 
join offer o on o.id = a.id 
Смежные вопросы