2013-07-02 52 views
0

我正在尝试建立一个网站,该网站控制出租物业组合。网站所有者可以为物业创建一个列表。该物业每晚有默认价格,但还包括设置特价的能力,例如8月。MySQL查询加入

网站用户可以进入网站并输入日期范围并搜索该时间段内可用的列表。我还需要在这个阶段看看是否有特殊的价格来取代默认价格。

所以表我已经是:

listings 
    id 
    default_price 
    etc... 

bookings 
    id 
    listing_id 
    checkin 
    checkout 

special_prices 
    id 
    listing_id 
    from 
    to 
    price 

但我很没用的SQL查询和我想不通查询会是什么样子,其过程中输入的时间内没有预订房源并且如果存在special_price的话。

我使用cakephp如果这使查询更容易建立。谁能帮我吗?

编辑 嗨,我仍然试图在一分钟我只是集中精力越来越不具有与所请求的日期相冲突的预订清单算出这个,我会整理一下之后

特殊价格的东西。在分钟我就要:

$conditions = array(
    "AND" => array(
     "OR" => array(
        "Listing.address_one LIKE" => "%".$area."%", 
        "Listing.address_two LIKE" => "%".$area."%", 
        "Listing.city LIKE" => "%".$area."%", 
        "Listing.postcode LIKE" => "%".$area."%", 
        "Listing.title LIKE" => "%".$area."%", 
        ), 
        ) 
       ); 

$this->Listing->bindModel(array('hasMany' => array('Booking' => array('conditions' =>array('Booking.checkin BETWEEN ? AND ?' => array($to, $from)))))); 
$data = $this->paginate('Listing', $conditions); 
$this->set('data', $data); 

这得到匹配在清单中的cols $面积关键字,所有的结果,但似乎完全忽略登记表。我已经尝试过不用间隔,看看它是否有所作为,它仍然只是返回任何匹配的$面积,并且看起来忽略了所请求的日期之间的预订。

任何任何想法?

+0

您是否正在尝试为此创建存储过程? – Novice

回答

1

有几种方法可以做到这一点,但是加入预订表并搜索空结果是实现它的一种方法。假设签入=预订日期...

SELECT 
* 
FROM listings l 
LEFT JOIN bookings b ON b.listing_id = l.id AND b.checkin BETWEEN YOUR START DATE AND YOUR_END_DATE 
WHERE b.id IS NULL 
0

这是通过使用相关子查询完成的。

SELECT li.id FROM listings li WHERE 
0=(SELECT COUNT(*) FROM bookings bo WHERE bo.listing_id=li.id 
AND bo.checkin="START DATE" AND bo.checkout="END DATE");