Si su formulario de reserva solicita $fechas/horas de inicio y $finalización de la reserva, esta consulta le indicará qué computadoras portátiles están disponibles durante el período especificado por esas dos fechas:
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)
Los dos primeros between
Las cláusulas encontrarán cualquier computadora portátil cuyas fechas de inicio/finalización no coincidan con las fechas de inicio/finalización solicitadas, p. están reservados, pero están disponibles en el intervalo de tiempo especificado. La verificación nula encontrará cualquier computadora portátil que no esté reservada en absoluto. Y la comprobación de types.id restringe la búsqueda solo a portátiles.