Я разрабатываю корзину для покупок. Чтобы обойти проблему старых счетов, показывающих неточные цены после изменения цены продукта, я переместил поле цены из таблицы Product в таблицу ProductPrice, которая состоит из 3 полей: pid, date и price. 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), кажется невероятным, что для такого простого звучащего запроса для выполнения потребуется внутреннее соединение. Мой вопрос заключается в том, является ли мое второе утверждение самым простым способом сделать то, что мне нужно сделать? Или я что-то здесь упускаю? Заранее спасибо!
Джеймс