SQL“检查可用性”语句

时间:2012-12-04 16:31:23

标签: mysql sql database

我有两个数据库表,一个存储属性,另一个存储属性的预订。以下是表结构的简化版本:

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个工作正常。我需要返回的属性如下:

  • 查询1(工作) - 1,2和3
  • 查询2(工作) - 2和3
  • 查询3(不工作) - 2和3
  • 查询4(不工作) - 2和3
  • 查询5(不工作) - 2和3

非常感谢任何帮助或建议。

UPDATE;

我认为我的措辞可能有点不清楚。我要做的是获取一个可用于给定日期范围(搜索日期)的租赁属性列表。如果是,物业将无法使用;搜索日期在现有的预订日期范围内,或在任一端重叠。如果在搜索日期之间没有任何预订时间,则可以使用该属性。

2 个答案:

答案 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