2016-11-25 3 views
3

Я разрабатываю систему бронирования, и в моей форме бронирования у меня есть выпадающий элемент, который возвращает (все еще) доступные начальные временные интервалы для системы бронирования.Выпадающий список с запросом на соединение

Создав новое бронирование, запрос, который я создал, работает нормально, и все доступные начальные временные интервалы возвращаются правильно.

QUERY:

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.heuredepart_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 

Смотрите видео: booking creationg

У меня есть проблема с использованием того же запроса путем редактирования существующего бронирования доступного времени начала слота возвращаются и это хорошо:

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

, но не уже выбранным клиентом (и в базе данных сохранен) временной интервал, который находится в моем примере 14:00.

Смотрите видео: Editing booking with same query

Dropdown должны быть заполнены следующие варианты:

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

I попытался создать запрос объединения, чтобы получить уже выбранный клиентом временной интервал времени и доступные (по-прежнему) доступные временные интервалы времени.

QUERY:

{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.heuredepart_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.heuredepart_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 
        ) 
      ) 
    ) 

Уже от клиента выбрано время начала слота возвращается (14:00), но другие доступные возвращаемое время запуска слоты не являются правильными.

Смотрите видео: Editing booking with union query

Я застрял, и я понятия не имею, как я мог бы решить эту проблему, так что я был бы признателен за помощь здесь.

Благодаря

Соответствующие таблицы базы данных

fab_booking с бронированием заинтересованного в видео

please download the sql table

fab_booking_taken с уже существующими бронирований 25 11 2016 ID = 347

Please download the sql table

ID 347 заинтересованный бронирование

fab_booking_slots таблицу, которая содержит все возможные временные интервалы

Please download the sql table

fab_heuredepart_resa таблица, которая заполнения выпадающего списка элемент

Please download the sql table

+1

Этот запрос довольно сложный. Это наверняка поможет, если вы разместите несколько выборочных данных для каждой из таблиц, на которые ссылаются ваши запросы. – mendosi

+1

Спасибо, mendosi, таблицы базы данных можно загрузить. – marcq

+0

Я не совсем понимаю ваши бизнес-правила, но если бронирование было с 14:00 до 17:30, и они хотели изменить время, почему только предлагают их 14:00, 18:00, 18:30, 19: 00 и 19:30? Почему бы и не 14:30, 15:00, 15:30, 16:00, 16:30, 17:00 и 17:30? – mendosi

ответ

0

Я должен признать, что сложнее попытаться распутать этот запрос, чтобы понять логику его, но я думаю что следующий запрос должен вернуть результаты, которые вам нужны.

{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; 

Я вполне уверен, что это логически эквивалентны, и когда-то выражается в упрощенной форме, как это легче увидеть, как вы можете получить его и вернуть дополнительный временной интервал.

У вас должен быть отдельный запрос для использования при заполнении временных интервалов для нового бронирования, у которого нет существующего временного интервала, и в этом случае вы можете просто удалить единственную строку t.id = '{fab_booking___book_starttime}' OR.

+0

Hi mendosi, Извините за мой поздний ответ и благодарю вас за то, что нашли время, чтобы помочь мне. Действительно, ваш запрос работает частично. Не из-за вас, а потому, что я забыл, что мне также нужно будет проверить, не выбрана ли продолжительность (через выпадающее меню) время, доступное между двумя заказами: два доступных слота. Я думаю, было бы легче для меня, если бы я мог заплатить за вас, чтобы выполнить эту работу, если вы, конечно, доступны, так как мне нужно найти решение. Вы заинтересованы? Если да, то как я могу связаться с вами, чтобы дать вам спецификации и получить цитату? – marcq

+0

@marcq Нет, я не думаю, что смогу это сделать. У меня на самом деле нет аппаратного или программного обеспечения, которое могло бы помочь в любой реальной емкости, кроме как на работе. Я могу просто ответить на некоторые вопросы SQL, подобные этому, используя SQLFiddle ... – mendosi

+0

Спасибо, mendosi, я понимаю, я попытаюсь найти другое решение. ура – marcq

 Смежные вопросы

  • Нет связанных вопросов^_^