2013-05-14 1 views
0

Я сделал эту таблицу со всеми датами лет, идущими до 2063 года, чтобы сохранить ее просто, она содержит 3 столбца, popluated, например, следующим образом ...Справка MYSQL/PHP - выбор следующих доступных дат из таблицы с каждой стороны от первоначального бронирования

AutoInc | date | status 

1  | 2013-05-05 | available 

2  | 2013-05-06 | available 

3  | 2013-05-07 | booked 

4  | 2013-05-08 | booked 

5  | 2013-05-09 | booked 

6  | 2013-05-10 | available 

7  | 2013-05-11 | booked 

8  | 2013-05-12 | available 

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

Вырезание в погоню, я установил, какие следующие доступные даты находятся в любом направлении, но мне нужно, чтобы он проверял блоки, то есть, где следующие 4 дня подряд доступны в любом направлении на Таблица. Возможны ли некоторые изменения в этом коде?

$previousDate = mysql_query("SELECT * FROM calendar WHERE autoInc < $requestedDate AND status='available' ORDER BY autoInc DESC"); 

Если вам нужно больше, пожалуйста, дайте мне знать,


OK, фактическая история до сих пор ...

Фактический стол

AutoIncNo | BookingDate | Status 

календарь в 2 части.

  1. Календарь для выбора даты

  2. в списке меню, чтобы выбрать количество ночей они хотят остаться.

Итак, я беру оригинальную дату (один они выбирают) и изменить формат, чтобы соответствовать таблице ...

$CalendarDate = str_replace("/", "-", "$CalendarDate"); 

    $QueryDate = date("Y-m-d", strtotime($CalendarDate)); 

Подключение к базе данных ...

include_once('../connect/connectdatabase.php'); 

Запустите первый запрос, чтобы проверить, доступны ли требуемые даты.

$ QueryDate даты они выбирают

$ NightsForQuery этого количество ночей они хотят остаться

$CalendarQuery = mysql_query("SELECT * FROM BookingsCalendar WHERE BookingDate='$QueryDate' LIMIT 1"); 

    while($row = mysql_fetch_array($CalendarQuery)) {$AutoInc = $row["AutoIncNo"];} 


    $AutoInc2 = $AutoInc + $NightsForQuery - 2; 


    $SelectDates = mysql_query("SELECT * FROM BookingsCalendar WHERE AutoIncNo BETWEEN $AutoInc AND $AutoInc2"); 

    while($row = mysql_fetch_array($SelectDates)) { 

     $AutoIncNo = $row["AutoIncNo"]; 
     $BookingDate = $row["BookingDate"]; 
     $Status = $row["Status"]; 

     if ($Status == 'booked') { 

      $LastBookedDate = $BookingDate; 
      $LastAutoIncNo = $AutoIncNo; 
      $Handle = 1; 

     } 

    } // End - while($row = mysql_fetch_array($SelectDates)) { 



if ($Handle !== 1) {echo 'DATES AVAILABLE >> WRITE BOOKING CODE';} 

Так что, если ручка не равна 1 его штрафа, и они могут заказать, но , если даты не доступны (т. е. $ Handle == 1), мне нужно проверить ближайшие доступные даты с обеих сторон (до и после), когда они хотят, где статус «доступен» для количества желаемых ночей чтобы остаться ...

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

if ($Handle == 1) { 


    $FirstDateQuery = mysql_query("SELECT * FROM BookingsCalendar WHERE AutoIncNo < $LastAutoIncNo AND Status='available' ORDER BY AutoIncNo DESC LIMIT 1"); 

    while($row = mysql_fetch_array($FirstDateQuery)) { 

     $AutoIncNo = $row["AutoIncNo"]; 
     $BookingDate = $row["BookingDate"]; 
     $Status = $row["Status"]; 


     } // End - while($row = mysql_fetch_array($SelectDates)) { 


    $FirstBookedDate = $BookingDate; 

    echo $FirstBookedDate . ' - ' . $LastBookedDate; 

} // End - if ($Handle == 1) { 

Если у вас есть более эффективный способ более или может адаптировать то, что уже здесь, это было бы великое ... Мой мозг болит лол.



Продолжение ...

я разделить его вниз к этому ...

SELECT * FROM BookingsCalendar WHERE Status='available' AND AutoIncNo < $LastAutoIncNo ORDER BY AutoIncNo DESC LIMIT 4 

Он работает мат, но он выбирает предыдущие 4 строки по отдельности.

Так, например, если кто-то пытается забронировать с 2013.06.01, но не может, потому что его «забронировали» в течение следующих 4 дней, этот сценарий запускается и поднимается до 2013.05.31 - 2013.05.30 - 2013.05.29 - 2013.05 .28 в результате.

Но если один из этих дат забронированы это пропустить и дать мне следующий (выбор, как это следующий 4, которые удовлетворяют условию «доступного»)

Так что, если скажем 2013.05.29 был забронирован он покажет 2013.05.31 - 2013.05.30 - 2013.05.28 - 2013.05.27, пропустив забронированный день.

Теперь дело в том, что нам нужны следующие 4 строки вместе (неразделенные/непрерывные/без перерывов в датах), которые являются «доступными».

Любые идеи?




UPDATE:

Дело в том, что он все равно будет выбрать следующие 4 строки, но не вместе, как они появляются по дате. Итак, если кто-то ищет за 4 дня до или после даты, они получат результат, но они будут распределены между датами, которые забронированы. Когда они забронируют, ему понадобится 1 полный период, посмотрите, что я имею в виду?

Возможно, я не очень хорошо объясняю это, поэтому сожалею об этом, но результат должен быть в блоке/вместе без каких-либо «забронированных дат между ними».

ВЕСЬ QUERY:

$FirstDateQuery = mysql_query("SELECT * FROM ((SELECT * FROM BookingsCalendar WHERE Status='available' AND AutoIncNo < $LastAutoIncNo ORDER BY AutoIncNo DESC LIMIT 4)UNION (SELECT * FROM BookingsCalendar WHERE Status='available' AND AutoIncNo > $LastAutoIncNo ORDER BY AutoIncNo ASC LIMIT 4)) as avail_4 ORDER BY avail_4.AutoIncNo DESC")or die(mysql_error()); 

    while($row = mysql_fetch_array($FirstDateQuery)) { 


     $AutoIncNo = $row["AutoIncNo"]; 
     $BookingDate = $row["BookingDate"]; 
     $Status = $row["Status"]; 
     $avail_4 = $row["avail_4"]; 

     echo $BookingDate . ' ' . $avail_4 . ' ' . '&nbsp;&nbsp;&nbsp;'; 

     } // End - while($row = mysql_fetch_array($FirstDateQuery)) { 

Это работает, но не совсем достичь цели.




DATA играть с:

эти сценарии настройки таблицы так, как я его ...

CREATE TABLE `table_setup` (
    `number` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`number`) 
) 
    COLLATE='utf8_general_ci' 
    ENGINE=MyISAM; 





    INSERT INTO table_setup VALUES(NULL); 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
INSERT INTO table_setup SELECT NULL FROM table_setup; 
DELETE FROM table_setup WHERE NUMBER > 18264; 





    CREATE TABLE `BookingsCalendar` (
    `AutoIncNo` SMALLINT(2) NOT NULL AUTO_INCREMENT, 
    `BookingDate` DATE NOT NULL, 
    `Status` VARCHAR(10) NOT NULL DEFAULT 'available' 
    `InvoiceRefference` varchar(40) NOT NULL, 
    `CustomerName` varchar(40) NOT NULL, 
    `CustomerEmail` varchar(40) NOT NULL, 
    `CustomerPhone` varchar(30) NOT NULL, 
    `Address1` varchar(100) NOT NULL, 
    `County` varchar(40) NOT NULL, 
    `Country` varchar(30) NOT NULL, 
    `PostCode` varchar(10) NOT NULL, 
    PRIMARY KEY (`AutoIncNo`) 

) 
    COLLATE='utf8_general_ci' 
    ENGINE=MyISAM; 





INSERT INTO BookingsCalendar (BookingDate) 
SELECT DATE_ADD('2013-05-05', INTERVAL number-1 DAY) 
FROM table_setup 
WHERE NUMBER < 18264; 





DROP TABLE `table_setup` 

ответ

2

Просто набрав из верхней части моего глава.

SELECT * FROM calendar 
WHERE DATE(date) BETWEEN DATE_SUB($requestedDate, INTERVAL 4 DAY) AND DATE_ADD($requestedDate, INTERVAL 4 DAY) 
AND status='available' 
ORDER BY autoInc DESC 

НТН

EDIT: Новый ответ, основанный на пересмотренном вопрос

SELECT * FROM (
(SELECT * FROM BookingsCalendar 
WHERE Status='available' AND AutoIncNo < $LastAutoIncNo 
ORDER BY AutoIncNo DESC LIMIT 4) 
UNION 
(SELECT * FROM BookingsCalendar 
WHERE Status='available' AND AutoIncNo > $LastAutoIncNo 
ORDER BY AutoIncNo ASC LIMIT 4) 
) as avail_4 
ORDER BY avail_4.AutoIncNo DESC 

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

+0

Спасибо за ваш ответ, я отредактировал это сообщение, чтобы больше информации было –

+0

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

+0

'SELECT * FROM (SELECT * FROM BookingsCalendar WHERE Status = 'доступен' и AutoIncNo <$ LastAutoIncNo ORDER BY AutoIncNo DESC LIMIT 4 UNION SELECT * FROM BookingsCalendar WHERE Status = 'доступен' и AutoIncNo> $ LastAutoIncNo ORDER BY AutoIncNo ASC LIMIT 4) as avail_4 ORDER BY avail_4.AutoIncNo DESC' –