2017-01-28 49 views
1

我目前正在致力于酒店预订服务,并且我想在特定时间段内显示特定房型和酒店的所有免费房间。 我发现什么似乎是一个工作查询,直到我注意到:如果一个房间没有任何保留,它不起作用。SQL在特定时间段内查找免费房间

SELECT DISTINCT r.id, 
      r.num, 
      r.NAME, 
      h.NAME, 
      h.city, 
      h.country 
FROM room r 
    JOIN hotel h 
    ON r.hotel_id = h.id 
    JOIN room_type rt 
    ON r.room_type_id = rt.id 
WHERE r.id NOT IN (SELECT room_id 
        FROM reservation 
        WHERE ('$from' BETWEEN start_date AND end_date) 
         OR (start_date BETWEEN '$from' AND '$to') 
         OR '$from' = start_date) 
    AND $roomtype = rt.id 
    AND $hotel = h.id 

这个查询将在PHP脚本中使用,其中“从$”是用户选择的预订日期开始至$的就是预约的结束等

有没有一种方法,使这项查询即使房间没有保留也可以工作吗? 任何帮助,非常感谢!

回答

0

逻辑用于无未室是:

  • 预订上或问题结束时段之前开始。
  • 预订在问题开始时或之后结束。

一个不是没有免费的房间可用。让我们将这个逻辑应用到您的查询:

SELECT r.id, r.num, r.name, h.name, h.city, h.country 
FROM room r JOIN 
    hotel h 
    ON r.hotel_id = h.id JOIN 
    room_type rt 
    ON r.room_type_id = rt.id 
WHERE rt.id = $roomtype AND 
     h.id = $hotel AND 
     r.id NOT IN (SELECT res.room_id 
        FROM reservation res 
        WHERE '$to' <= end_date AND 
         '$from' >= start_date AND 
       ); 

注意:你应该在你的查询中使用参数值,而不是改写(munging)查询字符串。

+0

非常感谢您的回复。我应用了你的逻辑,现在它终于正常工作了!在子查询之前检查rt.id和r.id也很有意义。谢谢 :) – heap1

相关问题