0

我得到了一些产品价格的表格,我可以在其中设置一个始终有效的价格,如果在查询运行时没有其他有效的价格。

id | item_id | valid_from | valid_to   | price
---+---------+------------+------------+------
1  | 1337    | 2013-01-17 | 2013-01-18 | 35.50
2  | 1337    | NULL       | NULL       | 39.95
3  | 1337    | 2013-01-13 | 2013-01-18 | 36.00

我不知道如何获得正确的价格NOW()(今天是 35.50),需要一些帮助。如果有两个或更多价格在一段时间内有效,我希望得到稍后开始的价格。到目前为止,我得到了:

SELECT price
FROM my_table
WHERE item_id = 1337
AND (
    valid_from <= NOW() AND
    valid_to >= NOW()
) OR (
    id NOT IN (
        SELECT id
        FROM my_table
        WHERE item_id = 1337
        AND valid_from <= NOW()
        AND valid_to >= NOW()
    ) AND
    valid_from IS NULL AND
    valid_to IS NULL
)
ORDER BY valid_from DESC
LIMIT 1

顺便说一句,我对这个表格结构并不满意。如果您对此有其他评论,我想阅读它们。非常感谢。

4

2 回答 2

1

除了将默认价格的日期值设置为 NULL,您还可以将它们设置得非常小和大:设置 valid_from = 1970 年 1 月 1 日和 valid_to = 2038 年 1 月 1 日。然后这些记录将始终包含在内,但不会包含在内如果有其他替代价格,则唯一的。

问题变成如何对结果集进行排序,但这取决于您的业务规则。现在你正在按 valid_from 排序,你可以继续这样做。如果您想要最低的价格,而默认价格总是最高的,您可以按价格排序。否则,您可以按 NOW() 和价格日期边界之间的时间长度以及最接近的日期获胜。正如我所说,这取决于你想如何在几个可能的竞争价格中进行选择。

于 2013-01-17T16:37:57.523 回答
0

试试这个,我认为检查valid_fromNULL足够了。

SELECT item_id, price
FROM tbl
WHERE item_id = 1337
     AND  valid_from <= NOW()
     AND  valid_to >= NOW()
     OR (valid_from IS NULL AND item_id = 1337) 
ORDER BY CASE WHEN valid_from IS NULL 1 ELSE 0 END, valid_from
LIMIT 1
于 2013-01-17T16:39:26.317 回答