2016-02-23 8 views
1

Я делаю проект для туристического агентства. я должен joing 3 таблицыКак написать запрос для этого условия

  • vehicle_details который я хранить все детали автомобиля
  • rac_details заказанные детали автомобиля
  • owner владельцев транспортных средств Детали

При бронировании мне нужно искать транспортные средства, доступные в том, что диапазон дат в rac_details.

 $qry=" SELECT `vehicle_details`.*, `owner`.`owner_name`, `owner`.`id` As owner_id, 
    `rac_details`.`from_date`, `rac_details`.`to_date`, 
    `rac_details`.`vehicle_id` 
    FROM (`vehicle_details`) 
    LEFT JOIN `rac_details` ON `rac_details`.`vehicle_id`=`vehicle_details`.`id` 
    AND `rac_details`.`from_date` NOT BETWEEN $from_timestamp AND $to_timestamp 
    AND `rac_details`.`to_date` NOT BETWEEN $from_timestamp AND $to_timestamp 
    JOIN `owner` ON `owner`.`id`=`vehicle_details`.`owner_id` 
WHERE `vehicle_details`.`model_id` = '$model_id' "; 

По вышеуказанному запросу я получаю все детали автомобиля. когда inner joinrac_details Я не могу получить только что добавленный автомобиль, который не имеет записи в rac_details. Надежда кто-нибудь может помочь мне

Редактировать

Например я получил номер для Polo с регистрационным нет XX-YY-ZZ с февраля 27-го до 3 марта, то мне нужно искать ли автомобиль xx- yy-zz доступен в те дни, потому что я только что искал в своих rac_details, где я хранил забронированные детали автомобиля. Тогда мы купили новый автомобиль Vento с регистрационными не RR-TT-YY, так что я добавил, что автомобиль в моей таблице vehicle_details и никаких записей не будут добавлены rac_details до первого заказа

если я записать этот запрос

$qry=" SELECT `vehicle_details`.*, `owner`.`owner_name`, `owner`.`id` As owner_id, 
    `rac_details`.`from_date`, `rac_details`.`to_date`, 
    `rac_details`.`vehicle_id` 
    FROM (`vehicle_details`) 
    JOIN `rac_details` ON `rac_details`.`vehicle_id`=`vehicle_details`.`id` 
    AND `rac_details`.`from_date` NOT BETWEEN $from_timestamp AND $to_timestamp 
    AND `rac_details`.`to_date` NOT BETWEEN $from_timestamp AND $to_timestamp 
    JOIN `owner` ON `owner`.`id`=`vehicle_details`.`owner_id` 
WHERE `vehicle_details`.`model_id` = '$model_id' "; 

, когда я забронировать Vento в первый раз он не будет показывать Vento в списке, так как нет ни одной записи в rac_details для Vento

+0

На первый взгляд ваше утверждение SELECT кажется невероятно длинным и сложным. Могло ли быть упрощено? Чем сложнее любой код, тем сложнее его отлаживать. Предложите для простоты, где это возможно, или можно написать запрос SELECT по-разному. Вы уверены, что данные сохраняются в таблице rac_details при ее бронировании? Что делает запрос SELECT для rac_details? Вам нужно обновить таблицу? –

+0

@Borges мне просто нужно получить список транспортных средств, доступных в данный диапазон дат. и я сохраняю забронированные детали в таблице 'rac_details'. сближение с запросом. – Juice

ответ

1

Я хотел бы попробовать с NOT IN ALR eady зарезервированные транспортные средства:

"SELECT `vehicle_details`.*, `owner`.`owner_name`, `owner`.`id` As owner_id, 
`rac_details`.`from_date`, `rac_details`.`to_date`, 
`rac_details`.`vehicle_id` 
FROM (`vehicle_details`) 
JOIN `owner` ON `owner`.`id`=`vehicle_details`.`owner_id` 
WHERE `vehicle_details`.`model_id` = '$model_id' 
AND vehicle_details.id NOT IN (
    SELECT rac_details.vehicle_id 
    FROM rac_details 
    WHERE `rac_details`.`from_date` BETWEEN $from_timestamp AND $to_timestamp 
    AND `rac_details`.`to_date` BETWEEN $from_timestamp AND $to_timestamp 
)" 
+0

Вы получили его на работу? –

+0

Нет Впервые таблица rac_details будет пуста. данные будут добавлены к этому, когда транспортное средство забронировано. – Juice

+0

@LimZ, Вы писали: «Мне просто нужно получить список транспортных средств, доступных в данный диапазон дат, и я сохраняю забронированные детали в таблице rac_details». Все транспортные средства, которые еще не забронированы, не доступны? Таким образом, вначале внутренний выбор будет пустым, поэтому NOT IN предоставит вам все идентификаторы транспортных средств. – Gavriel