2015-08-21 87 views
0

我有一个开始日期和结束日期。查看可用日期的房间

$s="YYYY-MM-DD"; 
$e="YYYY-MM-DD"; 

我需要做一个查询,检查该跨度的可用房间。

cObjects , cBookings_details 
cObjects_id = cBookings_details_cObjects_id 

我真的被困在这里,真的很感谢一些帮助。

我当前的查询

SELECT cObjects.* 
FROM cObjects LEFT JOIN cBookings_details ON cObjects.cObjects_id = cBookings_details.cBookings_details_cObjects_id 
WHERE cBookings_details.cBookings_details_arrival NOT BETWEEN '".$s."' AND '".$e."' 
AND cBookings_details.cBookings_details_departure NOT BETWEEN '".$s."' AND '".$e."' 
AND cBookings_details.cBookings_details_arrival <> '".$s."' AND cBookings_details_departure <> '".$s."' 
AND cBookings_details.cBookings_details_arrival <> '".$e."' AND cBookings_details_departure <> '".$e."' 
AND cObjects.cObjects_type < '2' 

OR cBookings_details.cBookings_details_id is null AND cObjects_type < '2' 
+1

你真的没有给我们太多去[如何问一个**好**问题](http://stackoverflow.com/help/how-to-ask) – 099

+0

你混合'或''和'和'没有任何'()'来执行解析顺序。首先解决这个问题,看看查询是否开始行为。 –

回答

2

这是一个常见的问题..实际上只是写了一个指南,了解此工作:

Selecting rows with start and end dates that feature in a chosen interval 
------------------------------------------------------------------------- 

Chosen Interval - :start_date (S) 
        :end_date  (E) 

Rows   - row.start_date (s) 
        row.end_date (e) 

Increasing date--> 

     S  E 
     |  |   Chosen Interval 

1.  s---e     Rows we want 
2.  s---e     . 
3.   s---e    . 
4.  s----------e    . 

5. s--e      Rows we don't want 
6.    s--e    . 

LOGIC: 
row.end_date >= :start_date AND row.start_date <= :end_date 

如果您正在寻找可用客房,LEFT JOIN房间使用上述逻辑的预订和SELECT行的预订为NULL

适用于您的架构,我相信这会出来为:

SELECT o.* 
    FROM cObjects o 
LEFT JOIN cBookings_details bd 
     ON bd.cBookings_details_cObjects_id = o.cObjects_id 
     AND bd.cBookings_details_arrival <= :end_date 
     AND bd.cBookings_details_departure >= :start_date 
    WHERE bd.cBookings_details_id IS NULL 
    (AND o.cObjects_type < '2') # Double check this is what you want 

顺便说一句,如果我有你的模式来工作,我会哭泣。为什么要重复列中的表名?它只是增加了噪音。

+1

工作就像一个魅力!谢谢!唯一的是,如果在2015年8月20日有退房,我需要在同一天登记入住另一位客人。我可以通过简单地将<= and > =替换为< and >来解决这个问题吗? @Arth – Martin

+0

@Martin没问题,高兴帮忙!从逻辑上来看,你选择的是预订,冲突然后打折相关的房间。如果他们是在结束日期抵达,是否会发生冲突?没有?然后从'AND bd.cBookings_details_arrival <=:end_date'中删除'='。如果在开始日期有离开,是否有问题?没有?然后从'bd.cBookings_details_departure> =:start_date'中删除另一个'='。然后测试它! – Arth