Как получить даты с резервированием?

Я пытаюсь создать систему, которая позволяет пользователям резервировать элемент, скажем, ноутбук.

Моя таблица выглядит так:

Table 'items' id int(20) PK auto_increment type int(20) FK(types.id) name varchar(200) Table 'types' id int(20) PK auto_increment name varchar(200) Table 'reservations' id int(20) PK auto_increment user int(20) FK(users.id) startDate datetime endDate datetime 

Допустим, у меня есть 1 тип (ноутбуки) и 3 ноутбука с одинаковыми характеристиками, и пользователь просто хочет зарезервировать один ноутбук. Как я могу получить все доступные даты только для ноутбука?

Я не возражаю, как это достигается, либо через PHP, либо MySQL, я просто хочу, чтобы у пользователей был список доступных дат для данного типа элементов.

Если в форме бронирования запрашиваются $ start и $ end date / times для бронирования, в этом запросе будут указаны доступные ноутбуки в течение периода, указанного этими двумя датами:

 SELECT items.id, items.name FROM items LEFT JOIN types ON items.type = types.id LEFT JOIN reservations ON reservations.item_id = items.id WHERE (((reservations.endDate NOT between $start AND $end) and (reservations.startDate NOT between $start AND $end)) or (reservations.id IS NULL)) and (types.id = $laptop_type_id) 

В первых двух between предложениями найдутся любые ноутбуки, чьи начальные и конечные даты не совпадают с запрошенными датами начала и окончания – например, они зарезервированы, но доступны в указанном диапазоне времени. Нулевая проверка найдет любые ноутбуки, которые не зарезервированы вообще. И проверка типов.id ограничивает поиск только портативными компьютерами.