2013-07-02 4 views
0

Я пытаюсь создать веб-сайт, который управляет портфелем объектов аренды. Владелец сайта может создать листинг для свойства. Имущество имеет стоимость по умолчанию за ночь, но также включает в себя возможность устанавливать специальную цену, например, на август.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, если это упрощает сбор запроса. Может кто-нибудь мне помочь?

EDIT Эй, ребята, я все еще пытаюсь понять это на минуте я просто сосредоточиться на получение списков, которые не имеют заказов, которые вступают в противоречие с указанными датами, и я разберусь специальные цены вещи после того

на минуту у меня есть:

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

Это получает все результаты, которые соответствуют $ области ключевого слова в списке перевалы, но, кажется, полностью игнорировать таблицу заказов. Я пробовал вставлять NOT BETWEEN, чтобы узнать, не изменилось ли это, и оно все равно просто возвращает все совпадения $ area и, по-видимому, игнорирует бронирование между запрошенными датами.

У вас есть идеи?

+0

Вы пытаетесь создать хранимую процедуру для этого? – Novice

ответ

1

Существует несколько способов сделать это, но LEFT JOINING the bookings table и поиск нулевых результатов - это один из способов обойти это. Предполагая 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 
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");