alekseyHunter
@alekseyHunter
Android developer

Как получить данные, не содержащиеся в таблице?

Добрый день.

Есть БД, в которой хранятся данные по бронированию аудиторий. В первой таблице хранится время, доступное для выбора. Во второй таблице записывается время из предыдущей таблице и становится забронированным. Требуется получить все промежутки свободного времени.

www.sqlfiddle.com/#!9/aa82ab/1/0

CREATE TABLE `date` (
  `hour_id` int(11) NOT NULL,
  `minutes_id` int(11) NOT NULL,
  `id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `reservation` (
  `id` int(11) NOT NULL,
  `classroom_id` int(11) NOT NULL,
  `datestart_id` int(11) NOT NULL,
  `dateend_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `reservation` (`id`, `classroom_id`, `datestart_id`, `dateend_id`) VALUES
(1, 340, 1, 4),
(2, 340, 6, 8);

INSERT INTO `date` (`hour_id`, `minutes_id`, `id`) VALUES
(1, 1, 1),
(1, 2, 2),
(1, 3, 3),
(1, 4, 4),
(2, 1, 5),
(2, 2, 6),
(2, 3, 7),
(2, 4, 8),
(3, 1, 9),
(3, 2, 10),
(3, 3, 11),
(3, 4, 12);


Использовал следующий запрос, но он вытягивает лишнюю первую строку и по результату не понятно в какой именно аудитории есть этот свободный промежуток времени:
Select * From date d where d.id not in(
SELECT d.id FROM date d, reservation r WHERE d.id BETWEEN r.datestart_id+1 and r.dateend_id-1)
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Как-то нелогично использование -1/+1, ведь дата начала означает, что в момент начала аудитория УЖЕ недоступна (занята).
Select * From date d where d.id not in(
SELECT d.id FROM date d, reservation r WHERE d.id BETWEEN r.datestart_id and r.dateend_id)

Вот так выдаёт действительно незанятые временные промежутки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы