#mysql #sql #mysqli
#mysql #sql
Вопрос:
Я пытаюсь написать запрос mysql с приведенными ниже деталями-
У меня есть три таблицы
1) Таблица бронирования со столбцом booking_id , journey_start_datetime , journey_end_datetime.
2) Таблица драйверов со столбцом driver_id драйвера, driver_name.
3) Таблица Driver_Assign со столбцом booking_id, driver_id, busy_start_datetime, busy_end_datetime.
Когда я назначаю бронирование водителю, новая запись переходит в таблицу Driver_Assign с подробными сведениями о booking_id , journey_start_datetime , journey_end_datetime.
Я хочу получить имена всех драйверов, которые не заняты в течение определенного времени. т.е.
Позволяет назначить одно бронирование водителю «John» для journey_start_datetime->’2014-06-27 12:00:00′ и journey_end_datetime->’2014-06-27 14:00:00′.
Теперь для нового бронирования (journey_start_datetime->’2014-06-27 13:00:00′ и journey_end_datetime->’2014-06-27 15:00:00′) водитель Джон не приедет.
Перемещение кода OP из комментария в вопрос —
SELECT U.driver_name
FROM driver AS U
where U.id not in
(select driver_id
from driver_assign as DVA
WHERE ('2014-06-27 13:00:00'>= DVA.busy_start_datetime OR
'2014-06-27 13:00:00'<= DVA.busy_end_datetime
) AND
('2014-06-27 15:00:00'>= DVA.busy_start_datetime OR
'2014-06-27 15:00:00'=< DVA.busy_end_datetime
)
)
Ответ №1:
SELECT d.driver_name
FROM driver d
LEFT JOIN driver_assign da ON da.driver_id=d.driver_id
WHERE
da.busy_start_datetime <='2014-06-27 13:00:00'
AND da.busy_end_datetime>='2014-06-27 13:00:00'
HAVING da.driver_id is null
Вам нужно просто соединить и исключить строки, которые не являются нулевыми (заняты)
Комментарии:
1. Будут ли busy_start_datetime и busy_end_datetime одинаковыми, т.е. «2014-06-27 13:00:00»?
2. Вы можете передать дату, необходимую для освобождения в обоих условиях
3. Извините, это не работает: ( У вас есть другой вариант? Пожалуйста, предложите.
Ответ №2:
SELECT d.driver_name
FROM driver d
WHERE d.driver_id not in
(SELECT driver_id from driver_assign
WHERE
(busy_start_datetime >= '2014-06-27 13:00:00' AND NOT busy_start_datetime >= '2014-06-27 15:00:00')
OR
(busy_end_datetime > '2014-06-27 13:00:00' AND NOT busy_end_datetime > '2014-06-27 15:00:00'
)
OR (busy_start_datetime < '2014-06-27 13:00:00' AND busy_end_datetime > '2014-06-27 15:00:00')
)
Комментарии:
1. На самом деле существует еще один ИЛИ, который необходимо будет добавить, где период в таблице driver_assign полностью содержится в пределах периода, который вы проверяете. Я отредактирую свой ответ.
2. Просто идея: вам действительно нужна таблица driver_assign? Вы могли бы просто поместить поле driver_id в таблицу бронирования.