0

クエリの実行時に有効な他の価格がない場合に常に有効な1つの価格を設定できる、いくつかの製品価格の表を取得しました。

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)を取得する方法がわからないため、ここでサポートが必要です。一定期間有効な価格が2つ以上ある場合は、後で開始する価格を取得する予定です。これまでのところ私は:

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 にする代わりに、非常に小さくて大きくすることができます: make valid_from = Jan 1, 1970 and valid_to = Jan 1, 2038. そうすると、これらのレコードは常に含まれますが、含まれません。他の代替価格がある場合の唯一のもの。

問題は結果セットをどのようにソートするかですが、これはビジネス ルールに依存します。現在、valid_from で並べ替えていますが、引き続きそれを行うことができます。最低価格が必要で、デフォルトの価格が常に最高になる場合は、価格で並べ替えることができます。それ以外の場合は、NOW() と価格日付の境界の間の時間の長さで並べ替えることができ、最も近い日付が優先されます。私が言うように、それはいくつかの競合する可能な価格の中からどのように選択したいかによって異なります.

于 2013-01-17T16:37:57.523 に答える
0

valid_fromこれを試してみてください。チェックするNULLだけで十分だと思います。

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 に答える