我有以下表格:
discount table:
id
name
description
amount
discount_exception
id
from_date
to_date
discount_id (foreign key to discount table)
折扣例外表用于存储折扣不应提供给用户的日期范围,因此不应显示。请注意,折扣和折扣异常之间存在 1:M 关系。换句话说,一个折扣可以有很多例外。
现在,我编写 SQL 的方式是获取所有折扣,然后在数组中循环遍历它们,并查询 discount_exception 表以了解每个折扣是否在特定日期范围内。我更愿意修改 SQL,以便一个数据库调用可以获取所有不包含在指定日期范围内的异常日期的折扣。
例如,如果用户正在购买 2013-5-1 和 2013-5-5 之间运行的 5 天服务,我想检查 discount 和 discount_exception 表以找出哪些折扣在 2013-5 内有例外-1 和 2013-5-5,然后仅显示在指定日期范围内没有例外的折扣。有没有办法用一个 select 语句来做到这一点,而不是分解 SQL 来为每个折扣单独调用数据库?我很难理解 SQL,尤其是当 discount 表和 discount_exception 表之间存在 1:M 关系时。
我正在尝试这样的事情:
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');
但是这个和这个的其他变体似乎并不奏效。知道我做错了什么吗?
谢谢!