繁体   English   中英

MySQL查询联接

[英]MySQL Query join

我正在尝试建立一个控制出租物业组合的网站。 网站所有者可以为财产创建列表。 该酒店有每晚的默认价格,但还可以设置特殊价格,例如,八月。

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

所以我有的表是:

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);

这将获得与Listing cols中的$ area关键字匹配的所有结果,但似乎完全忽略了Bookings表。 我尝试放入NOT BETWEEN,以查看是否有所作为,并且它仍然只返回匹配$ area的任何内容,并且似乎忽略了请求日期之间的预订。

有任何想法吗?

有几种方法可以做到这一点,但是左联接预订表并搜索空结果是解决问题的一种方法。 假设签到=预订日期...

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

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

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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM