У меня есть следующие таблицы товаров и цен:
таблица: продукт
productID
---------
1
2
3
4
5
стол: цена
priceID productID started expires
-------------------------------------------
1 1 2011-11-05 NULL
2 1 2011-11-05 2011-11-20
3 2 2011-11-05 NULL
4 3 2011-11-05 NULL
5 3 2011-11-06 2011-11-08
и я хочу присоединиться к ним таким образом, чтобы:
- Только одна цена за товар
- Цены действительны, если
price.started <= NOW() AND ( price.expires >= NOW() || price.expires IS NULL )
- Если для одного продукта действует более одной цены, следует выбрать цену с более высоким значением
price.priceID
- Если цена не действительна, по-прежнему показывать информацию о продукте
Эти четыре критерия определяют наиболее действительные (на удачу лучшего срока) действительных цен. Таким образом, для NOW() == 2011-11-09
конечный результат должен быть:
priceID productID started expires
-------------------------------------------
2 1 2011-11-05 2011-11-20
3 2 2011-11-05 NULL
4 3 2011-11-05 NULL
Я застрял в
- Если для одного продукта действует более одной цены, следует выбрать цену с более высоким
price.priceID
требование, которое проистекает из странного делового требования для более чем одной действительной цены для любого данного продукта в течение периода времени. Мой sql fu очень плохой, я дошел до:
SELECT
product.*,
price.*
FROM
product
LEFT JOIN
price
ON
price.productID = product.productID
AND price.started <= NOW()
AND (
price.expires IS NULL
OR price.expires >= NOW()
)
Что, конечно, для NOW() == 2011-11-09
приводит к:
productID priceID productID started expires
-------------------------------------------------------
1 1 1 2011-11-05 NULL
1 2 1 2011-11-05 2011-11-20
2 3 2 2011-11-05 NULL
3 4 3 2011-11-05 NULL
Разъяснения (на основе комментариев и ответов):
- Требования уникальны, но действительны. Перекрывающиеся интервалы - это фактическое требование бизнеса, иногда мне нужно показывать все цены (просто), а иногда только одну, более свежую (о чем я спрашиваю).
- Не могу многое сделать, чтобы изменить модель данных.
- Я ищу всё соединение, если возможно. (или подсказки о том, как подзапросы могут быть интегрированы в окончательное объединение)
- Я бы предпочел решения, основанные на стандартном SQL (ANSI / ISO) или MySQL.