Jag måste erkänna att det är skrämmande att försöka reda ut den frågan för att förstå logiken bakom den, men jag tror att följande fråga bör returnera de resultat du behöver.
{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;
Jag är ganska säker på att detta är logiskt likvärdigt, och när det väl uttrycks i en förenklad form som denna är det lättare att se hur du kan få det att även returnera den extra tidsluckan.
Du bör ha en separat fråga att använda när du fyller i tidsluckor för en ny bokning som inte har en befintlig tidslucka, i så fall kan du bara ta bort den enda raden t.id = '{fab_booking___book_starttime}' OR
.