我需要用他们的历史来存储价格。价格可以具有不同的特异性。它可以指单个用户(最具体)、组(不太具体)和产品价格(全局 - 最不具体)。还有两种不同类型的价格(产品价格和交货价格)。现在我遇到了这个问题。我让它工作了,但是当我编写查询时我不知何故感觉不好(它们往往变得冗长而复杂)。
我设计了两个这样的表(它们是相同的):
| id | referent_id | product_id | valid_from | valid_until | amount | pieces_per_lot |
Run Code Online (Sandbox Code Playgroud)
| id | referent_id | product_id | valid_from | valid_until | amount | pieces_per_lot |
Run Code Online (Sandbox Code Playgroud)
对于用户特定的价格参考 id 将是一个正整数,匹配用户 id。对于特定于组的价格参考 id 将是一个负整数,匹配组 id(我将组 id 设为负整数)。对于全球产品价格,参考 ID 将为 NULL。这样,当我查询特定项目和特定用户及其组的价格时,我需要做的就是按 item_id 过滤表并按 referent_id 列按降序排列结果。这样,特定于用户的在顶部,组之后和全局在最后。
两行的日期范围 valid_from-valid_until 不能重叠。
现在,获取当前价格的查询将如下所示:
SELECT
*
FROM
base_prices AS outer
WHERE
id = (
SELECT
id
FROM
base_prices AS inner
WHERE
NOW() BETWEEN valid_from AND valid_until
AND inner.item_id …Run Code Online (Sandbox Code Playgroud)