За последние 24 часа нас посетил 16771 программист и 1646 роботов. Сейчас ищут 906 программистов ...

Как проверить повторения в бд и выдать номер?

Тема в разделе "PHP для новичков", создана пользователем drkrol, 6 дек 2016.

  1. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    Здравствуйте. Пишу скрипт для бронирования номеров в гостинице.
    Есть две вот такие таблицы:
    allnomer http://sqlfiddle.com/#!9/75102 , где указаны все номера. В гостинице есть 3 номера lux: 301, 302 и 303
    и main http://sqlfiddle.com/#!9/02c4e , где указаны все брони.
    Я пытаюсь сделать скрипт, который будет проверять номера на занятость, и в случае нахождения свободного номера, выдаёт брони этот номер.
    Чуть подробнее. У меня есть дата заезда и дата выезда новой брони: 2016-11-28 и 2016-11-30. Это диапазон дат. То есть 28, 29 и 30 числа в гостинице собираются жить люди. В гостинице уже забронированы два номера. Первый (301) на даты с 2016-11-29 по 2016-12-01, второй (302) на даты с 2016-12-01 по 2016-12-02. Человек не может заехать в 301 номер, так как 29 и 30 числа этот номер будет занят. У нас остаётся два номера: 302 и 303. 302 номер занят только 01 и 02. Ни одна дата не пересекается и поэтому нам 302 номер подходит. Переменная $namenomer принимает значение 302 и подставляется в скрипт.
    Подскажите, как сделать проверку на свободность номера, чтобы, в случае хотя бы одного совпадения, проверялся следующий номер? Вероятность того, что на этом этапе не найдётся ни одного свободного номера исключена. До этого этапа уже есть скрипт, который проверяет все номера на свободность. Однако он проверяет все номера. Этот же скрипт нужен для проверки определённых номеров.

    Вот такой у меня сейчас код:
    PHP:
    1. SELECT a.nomer
    2. FROM allnomer a
    3. LEFT JOIN main m ON
    4. a.nomer = m.numbernomer AND (
    5. m.datestart BETWEEN '2016-11-28' AND '2016-11-30' OR
    6. m.dateend BETWEEN '2016-11-28' AND '2016-11-30' )
    7. WHERE a.TYPE = 'lux' AND m.id IS NULL
    И эти даты он обрабатывает правильно. Я получаю ответ 302.

    Но если структура таблицы main вот такая http://sqlfiddle.com/#!9/fba1bd
    А запрос вот такой:
    PHP:
    1. SELECT a.nomer
    2. FROM allnomer a
    3. LEFT JOIN main m ON
    4. a.nomer = m.numbernomer AND (
    5. m.datestart BETWEEN '2016-12-23' AND '2016-12-23' OR
    6. m.dateend BETWEEN '2016-12-23' AND '2016-12-23' )
    7. WHERE a.TYPE = 'lux' AND m.id IS NULL
    То возвращается 301, хотя 23 число находится в диапазоне чисел таблицы main.
    Тоже самое со всеми числами, которые находятся в этом промежутке, кроме 19 и 25 числа.
    PHP:
    1. m.datestart BETWEEN '2016-12-18' AND '2016-12-20' OR
    2. m.dateend BETWEEN '2016-12-18' AND '2016-12-20' )
    То сработает всё правильно: вернётся 302