Jeg må indrømme, at det er skræmmende at forsøge at løse den forespørgsel for at forstå logikken bag den, men jeg tror, at den følgende forespørgsel skal returnere de resultater, du har brug for.
{thistable}.id IN (
/*Finds booking slots where the booking slot does not overlap
with any of the existing bookings on that day,
or where the booking slot id is the same as the current slot.*/
SELECT t.id + 3
FROM fab_booking_slots AS t
WHERE t.id = '{fab_booking___book_starttime}'
OR NOT EXISTS (
Select 1
From fab_booking_taken AS p1
Where Date(p1.book_date) = Date('{fab_booking___book_bookingdate}')
And p1.book_end > t.heuredepart_resa
And p1.book_start < t.heurearrivee_resa
)
)
Order By id Asc;
Jeg er ret sikker på, at dette er logisk ækvivalent, og når det først er udtrykt i en forenklet form som denne, er det lettere at se, hvordan du kan få det til også at returnere det ekstra tidsrum.
Du bør have en separat forespørgsel, du kan bruge, når du udfylder tidsvinduerne for en ny reservation, der ikke har et eksisterende tidsrum, i hvilket tilfælde du bare kan fjerne den enkelte linje t.id = '{fab_booking___book_starttime}' OR
.