Desplegable con consulta sindical

Estoy desarrollando un sistema de reserva y en mi formulario de reserva tengo un elemento desplegable que está devolviendo (todavía) espacios de inicio disponibles para un sistema de reserva.

Al crear una nueva reservación, la consulta que he creado funciona bien y todos los espacios disponibles de inicio se devuelven correctamente.

CONSULTA :

WHERE {thistable}.id IN ( SELECT id +3 FROM ( SELECT p1.book_date, t.*, count(p1.book_date) AS nbre FROM fab_booking_taken AS p1 CROSS JOIN fab_booking_slots AS t WHERE NOT ((t.heunetworkingepart_resa < p1.book_end AND t.heurearrivee_resa > p1.book_start)) AND DATE(p1.book_date)=DATE('{fab_booking___book_bookingdate}') GROUP BY t.id) AS x WHERE nbre = ( SELECT count(p2.book_date) FROM fab_booking_taken AS p2 WHERE p2.book_date = x.book_date ) ) ORDER BY id ASC 

Por favor mira el video: booking creatingg

El problema que tengo al usar la misma consulta editando una reserva existente, los intervalos de time de inicio disponibles son devueltos, lo que está bien:

18:00 18:30 19:00 19:30

pero no el intervalo de time elegido por el cliente (y guardado en la database) que está en mi ejemplo 14:00.

Ver video: Edición de reserva con la misma consulta

El menu desplegable se debe completar con las siguientes opciones:

14:00 18:00 18:30 19:00 19:30

Traté de crear una consulta de unión para get el intervalo de time de inicio elegido por el cliente y las franjas horarias de inicio (todavía) disponibles.

CONSULTA :

  {thistable}.id IN ( SELECT id + 3 FROM ( SELECT p1.book_date, t.*, count(p1.book_date) AS nbre FROM fab_booking_taken AS p1 CROSS JOIN fab_booking_slots AS t WHERE NOT ((t.heunetworkingepart_resa < p1.book_end AND t.heurearrivee_resa > p1.book_start)) AND p1.book_date = DATE_FORMAT('{fab_booking___book_bookingdate}', '%Y-%m-%d') GROUP BY t.id ) as foobar2 UNION ( SELECT id + 3 FROM ( SELECT p1.book_date, t.*, count(p1.book_date) AS nbre FROM fab_booking_taken AS p1 CROSS JOIN fab_booking_slots AS t WHERE ( ( t.heunetworkingepart_resa < p1.book_end AND t.heurearrivee_resa > p1.book_start ) ) AND t.id = '{fab_booking___book_starttime}' AND p1.book_date = DATE_FORMAT('{fab_booking___book_bookingdate}', '%Y-%m-%d') GROUP BY t.id ) AS x WHERE nbre = ( SELECT count(p2.book_date) FROM fab_booking_taken AS p2 WHERE p2.book_date = x.book_date ) ) ) 

El intervalo de time de inicio elegido por el cliente se devuelve (14:00) pero los otros intervalos de time de inicio de devolución disponibles no son correctos.

Ver video: Edición de reserva con consulta sindical

Estoy atascado y no tengo idea de cómo podría resolver este problema, por lo que agradecería algo de ayuda aquí.

Gracias

Tablas de database relevantes

fab_booking con la reserva en cuestión en el video

por favor descargue la tabla sql

fab_booking_taken con las reservas ya existentes en 25 11 2016 id = 347

Descargue la tabla sql

id 347 es la reserva en cuestión

tabla fab_booking_slots que contiene todos los espacios de time posibles

Descargue la tabla sql

fab_heunetworkingepart_resa tabla que puebla el elemento desplegable

Descargue la tabla sql

Tengo que admitir que es desalentador tratar de desentrañar esa consulta para comprender la lógica detrás de ella, pero creo que la siguiente consulta debería devolver los resultados que necesita.

 {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.heunetworkingepart_resa And p1.book_start < t.heurearrivee_resa ) ) Order By id Asc; 

Estoy bastante seguro de que esto es lógicamente equivalente, y una vez expresado en una forma simplificada como esta, es más fácil ver cómo puede lograr que también devuelva el intervalo de time adicional.

Debería tener una consulta separada para t.id = '{fab_booking___book_starttime}' OR los espacios de time para una nueva reserva que no tenga un intervalo de time existente, en cuyo caso puede eliminar la única línea t.id = '{fab_booking___book_starttime}' OR