MySQL Query连接

时间:2013-07-02 12:59:17

标签: php mysql cakephp

我正在努力建立一个控制出租物业组合的网站。网站所有者可以为属性创建列表。该物业具有每晚的默认价格,但也包括设置特殊价格的功能,例如,8月。

网站用户可以访问该网站并输入日期范围并搜索该时间段内可用的列表。我还需要在那个阶段查看是否需要特殊价格来替换默认价格。

所以我的表格是:

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中的$ area关键字匹配的所有结果,但似乎完全忽略了Bookings表。我已经尝试放入NOT BETWEEN以查看它是否有所作为,它仍然只返回任何匹配$ area并且似乎忽略了所请求日期之间的预订。

任何想法?

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点,但LEFT JOINING预订表并搜索空结果是实现这一目标的一种方式。假设checkin =预订日期......

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

答案 1 :(得分: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");