Множественный выбор запроса MySQL - PullRequest
1 голос
/ 28 февраля 2012

Я новичок в php, mysql и всем, что есть в Интернете. У меня есть проблема, которую я подозреваю, что множественный выбор может или не может решить. Если вы не думаете, что это лучший способ что-либо сделать, будь то объявление таблицы или что-то еще, дайте мне знать, у меня есть 3 таблицы.


| ОТЕЛЬ |

  • ID
  • hotel_title
  • название * * +1011
  • Город * * 1013
  • Страна

| Размещение |

  • ID
  • LOCATION_ID
  • название
  • размер
  • ванная

| Unavailable_dates |

  • ID
  • accommodation_id
  • 1041 * начать *
  • конец

Таким образом, как можно заключить, несколько гостиниц могут быть перечислены в одной гостинице. Например. Полулюкс, номер люкс и т. Д. Каждое жилье также имеет даты, в которые оно недоступно. Я пытаюсь добиться того, чтобы, когда пользователь вводит диапазон дат пребывания, он совпадает с одной записями в "Unavailable_dates" определенного места размещения, но это место не возвращается.

Например

| Unavailable_dates |

|-id-| accommodation_id |    start   |    end    |
|-1--|-----2------------|--12/02/12--|-20/02/12--|
|-2--|-----2------------|--07/03/12--|-26/03/12--|

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

Дополнительные сведения

SELECT location.*, accommodation.* 
    FROM location 
        JOIN (accomodation, Unavailable_dates) 
            ON (location.id = accommodation.location_id
                AND accommodation.id = unavailable_date.accommodation_id) 
    WHERE location.city='Birmingham' 
        AND 'check_in_date' NOT BETWEEN hotel_dates.start AND hotel_dates.end
        AND 'check_out_date' NOT BETWEEN hotel_dates.start AND hotel_dates.end

Если моя check_in_date находится между начальной и конечной датой первой записи, а моя check_out_date находится между моей начальной и конечной датой второй записи, то ни один элемент не возвращается. Это нормально, однако, если моя дата заезда находится в пределах даты начала и окончания первых записей, но моя дата выезда не находится между моими вторыми записями, это вернет жилье как доступное.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Из того, что я понимаю, вам нужен список доступных мест. Теперь, в зависимости от структуры данных, которые вы получили, т. Е. Недоступные даты, было бы легче найти недоступные места, настроив ваш запрос, как показано ниже:

Недоступно для проживания

SELECT DISTINCT accommodation.id 
FROM location 
    JOIN (accomodation, Unavailable_dates) 
        ON (location.id = accommodation.location_id
            AND accommodation.id = unavailable_date.accommodation_id) 
WHERE location.city='Birmingham' 
    AND ('check_in_date' BETWEEN hotel_dates.start AND hotel_dates.end
    OR 'check_out_date' BETWEEN hotel_dates.start AND hotel_dates.end)

После того, как вы получите список недоступных мест, можно сразу получить доступные:

Доступные помещения

SELECT location.*, accommodation.*  
FROM location  
JOIN (accomodation, Unavailable_dates)  
    ON (location.id = accommodation.location_id 
        AND accommodation.id = unavailable_date.accommodation_id)
        WHERE location.city='Birmingham' 
AND accomodation.id not in
(SELECT DISTINCT accommodation.id 
FROM location 
    JOIN (accomodation, Unavailable_dates) 
        ON (location.id = accommodation.location_id
            AND accommodation.id = unavailable_date.accommodation_id) 
WHERE location.city='Birmingham' 
    AND ('check_in_date' BETWEEN hotel_dates.start AND hotel_dates.end
    OR 'check_out_date' BETWEEN hotel_dates.start AND hotel_dates.end))

PS: проверьте синтаксис и другие условия, которые вы можете захотеть применить.

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

Надеюсь, это имеет смысл.

0 голосов
/ 28 февраля 2012

ПОПРОБУЙТЕ ЭТО:

SELECT location.*, accommodation.*  
FROM location  
    JOIN (accomodation, Unavailable_dates)  
        ON (location.id = accommodation.location_id 
            AND accommodation.id = unavailable_date.accommodation_id)  
WHERE location.city='Birmingham'  
    AND (('check_in_date' NOT BETWEEN hotel_dates.start AND hotel_dates.end)
    OR ('check_out_date' NOT BETWEEN hotel_dates.start AND hotel_dates.end))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...