【发布时间】:2011-11-09 12:40:28
【问题描述】:
我有以下产品和价格表:
表格:产品
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
澄清(基于 cmets 和答案):
- 这些要求很奇怪,但很有效。重叠间隔是实际的业务需求,有时我需要显示所有价格(简单),有时只显示一个,最近的(我要问的)。
- 无法更改数据模型。
- 如果可能的话,我正在寻找整个连接。 (或关于如何将子查询集成到最终连接中的提示)
- 我更喜欢基于标准 SQL (ANSI / ISO) 或 MySQL 的解决方案。
【问题讨论】:
-
我想不出一个更具描述性的标题,如果您觉得更好,请随时编辑。
-
同一价格的有效产品可以有多个价格吗?
-
@RedFilter 每个产品可以有任意数量的有效价格。我正在寻找一种基于四个标准来获得最有效(为了更好的术语)的方法。
-
应该有一个约束来禁止重叠间隔。这样可以避免这种混乱。
-
@wildplasser 重叠间隔是实际的业务需求。不幸的是,无法避免。