我有两个数据库表,一个存储属性,另一个存储属性的预订。以下是表结构的简化版本:
property
+-------------------+--------------+
| Field | Type |
+-------------------+--------------+
| id | int(11) |
| status | int(1) |
| title | varchar(150) |
+-------------------+--------------+
booking
+-------------------+--------------+
| Field | Type |
+-------------------+--------------+
| id | int(11) |
| status | int(1) |
| property_id | int(11) |
| start_date | date |
| end_date | date |
+-------------------+--------------+
我有一个搜索表单,其中包含开始日期和结束日期,以查看在给定时间段内可用的属性。例如“2012-12-01和2012-12-07之间可以租用哪些房产”。
我有以下SQL,它在某种程度上起作用:
SELECT p.id, p.title FROM property p WHERE p.status=1 AND p.id NOT IN (SELECT
b.property_id FROM booking b WHERE (b.status=1 OR b.status=2 OR b.status=3 OR
b.status=6) AND NOT (b.enddate < '2013-05-30' OR b.startdate > '2013-05-24'))
ORDER BY p.title ASC
问题是,它不处理日期的重叠。如果搜索的是现有预订中的日期范围,则SQL工作正常,并且不返回该属性。但是,如果搜索日期与预订日期重叠,则即使在部分搜索期间预订了房产,房产仍会被退回。
我在这里设置了一个SQL小提琴:http://sqlfiddle.com/#!2/d02e1/4 - 有5个查询 - 前2个工作正常。我需要返回的属性如下:
非常感谢任何帮助或建议。
UPDATE;
我认为我的措辞可能有点不清楚。我要做的是获取一个可用于给定日期范围(搜索日期)的租赁属性列表。如果是,物业将无法使用;搜索日期在现有的预订日期范围内,或在任一端重叠。如果在搜索日期之间没有任何预订时间,则可以使用该属性。
答案 0 :(得分:0)
需要这样的东西吗?:
SELECT p.id, p.title
FROM property p
WHERE p.status=1 AND p.id NOT IN (
SELECT b.property_id
FROM booking b
WHERE (b.status IN (1, 2, 3, 6))
AND (b.end_date BETWEEN '2012-12-01' AND '2012-12-30'
OR b.start_date BETWEEN '2012-12-01' AND '2012-12-30')
)
ORDER BY p.title ASC;
它返回2和3
答案 1 :(得分:0)
在这里管理解决它是小提琴:http://sqlfiddle.com/#!2/d02e1/64