Je dois admettre qu'il est décourageant d'essayer de démêler cette requête pour comprendre la logique qui la sous-tend, mais je pense que la requête suivante devrait renvoyer les résultats dont vous avez besoin.
{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;
Je suis à peu près sûr que c'est logiquement équivalent, et une fois exprimé sous une forme simplifiée comme celle-ci, il est plus facile de voir comment vous pouvez l'obtenir pour renvoyer également le créneau horaire supplémentaire.
Vous devriez avoir une requête distincte à utiliser lors du remplissage des créneaux horaires pour une nouvelle réservation qui n'a pas de créneau horaire existant, auquel cas vous pouvez simplement supprimer la seule ligne t.id = '{fab_booking___book_starttime}' OR
.