Я проектирую корзину покупок. Чтобы обойти проблему старых счетов-фактур, показывающих неточные цены после изменения цены продукта, я переместил поле цены из таблицы Product в таблицу ProductPrice, которая состоит из трех полей, pid, даты и цены. pid и date образуют первичный ключ для таблицы. Вот пример того, как выглядит таблица:
pid date price
1 1/1/09 50
1 2/1/09 55
1 3/1/09 54
Используя SELECT
и GROUP BY
, чтобы найти самую последнюю цену каждого продукта, я придумал:
SELECT pid, price, max(date) FROM ProductPrice GROUP BY pid
Дата и pid были точными. Я получил ровно 1 запись за каждый уникальный pid, и дата, которая сопровождала его, была последней датой для этого pid. Однако неожиданным было то, что цена вернулась. Он возвратил цену первой строки, соответствующей pid, которая в этом случае была равна 50.
После обработки моего заявления я придумал следующее:
SELECT pp.pid, pp.price, pp.date FROM ProductPrice AS pp
INNER JOIN (
SELECT pid AS lastPid, max(date) AS lastDate FROM ProductPrice GROUP BY pid
) AS m
ON pp.pid = lastPid AND pp.date = lastDate
В то время как инструкция переработанной версии теперь дает правильную цену (54), кажется невероятным, что для такого простого запроса звучания потребуется выполнить внутреннее соединение. Мой вопрос в том, является ли мое второе выражение самым простым способом выполнить то, что мне нужно сделать? Или я чего-то не хватает? Спасибо заранее!
Джеймс