私は次のテーブルを持っています:
discount table:
id
name
description
amount
discount_exception
id
from_date
to_date
discount_id (foreign key to discount table)
割引例外テーブルは、ユーザーが割引を利用できないため表示すべきでない日付範囲を格納するために使用されます。discountとdiscount_exceptionの間には1:Mの関係があることに注意してください。つまり、1つの割引には多くの例外があります。
今のところ、SQLを記述した方法は、すべての割引を取得し、それらを配列でループし、discount_exceptionテーブルをクエリして、各割引が特定の日付範囲内にあるかどうかを確認することです。1回のデータベース呼び出しで、指定された日付範囲内の例外日付を持たないすべての割引を取得できるように、SQLを変更したいと思います。
たとえば、ユーザーが2013-5-1と2013-5-5の間に実行される5日間のサービスを購入している場合、discountとdiscount_exceptionテーブルをチェックして、2013-5に該当する例外がある割引を確認したいと思います。 -1および2013-5-5の場合、指定された日付範囲内に例外がない割引のみを表示します。SQLを分割して割引ごとにデータベースを個別に呼び出す代わりに、1つのselectステートメントでこれを行う方法はありますか?特に割引テーブルとdiscount_exceptionテーブルの間に1:Mの関係がある場合は、SQLに頭を悩ませるのに苦労しています。
私はこれに沿って何かを試みていました:
SELECT * FROM discount INNER JOIN `discount_exceptions` ON discount.id = discount_exceptions.discount_id AND (discount_exceptions.date_from NOT BETWEEN '2013-5-1' AND '2013-5-5' OR discount_exception.date_to NOT BETWEEN '2013-5-1' AND '2013-5-5');
しかし、これとこれの他のバリエーションは機能していないようです。私が間違っていることについて何か考えはありますか?
ありがとう!