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