搜索可用日期的正确mySQL语句

时间:2011-04-04 17:29:55

标签: mysql

我意识到这个问题已经以各种形式提出,但我正在努力将其实现到我的应用程序中。

以下是我的表格设置:

home: home_id, booking_id, name, address, location, etc
booking: booking_id, fromdate, todate

我正在尝试构建一个可以返回房屋可用性的搜索。因此,如果家庭“A”未从“2011年4月4日 - 4/10/2011”预订,那么它将返回“A”作为结果。

感谢您的帮助。

好的,所以根据你们的说法,我已经对我的表进行了调整以规范化它们,然后在我的PHP中使用了以下查询:

SELECT home.home_id,home.name,home.address 从家里 LEFT JOIN(选择home_id            从预订            来自BETWEEN'2011-04-06'和'2011-04-07'的日期            或者预约BETWEEN'2011-04-06'和'2011-04-07') 在home.home_id = booking.home_id 在哪里booking.home_id IS NULL

但是,当我在我的预订表中有一个条目是“booking_id = 1”,“home_id = 1”,“from_date = 2011-03-31”,“to_date = 2011-04-10”使用上面的内容示例返回我不想要的这一行。我将尝试大于值,看看这是否解决了这个问题。

2 个答案:

答案 0 :(得分:1)

SELECT H.home_id, H.name, H.address, H.location
FROM Home H
LEFT JOIN (SELECT booking_id
           FROM booking
           WHERE @fromdate BETWEEN fromdate AND todate
           OR @todate BETWEEN fromdate AND todate) B
ON H.booking_id = B.booking_id
WHERE B.booking_id IS NULL

答案 1 :(得分:1)

除非你从一个规范化的数据库开始 - 它当前的架构没有任何意义 - 它可能有多个预订 - 但你似乎将home_id作为主页引用预订中的外键 - 这应该不会起作用 - 这应该是相反(预订应参考home_id)。

使用正确的架构:

SELECT home.*
FROM home h
WHERE NOT EXISTS (
   SELECT 1 FROM booking b
   WHERE b.end_date>$start_time
   AND b.start_date<$end_time
   AND b.home_id=h.home_id
);

SELECT home.*
FROM home h 
LEFT JOIN booking b
ON (b.home_id=h.home_id
   AND b.end_date>$start_time
   AND b.start_date<$end_time
)
WHERE b.home_id IS NULL;

预订时索引(start_time,end_time,home_id)应该合理有效。