0

我制作了这张表,所有日期都在 2063 年之前,为了简单起见,它包含 3 列已预先填充的列,示例如下...

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");

如果您需要更多,请告诉我,


好的,到目前为止的实际故事......

实际表

AutoIncNo |    BookingDate    | Status

日历分为两部分。

  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 行一起(不分割/连续/不中断日期),它们是“可用的”。

有任何想法吗?




更新:

问题是它仍然会选择接下来的 4 行,但不会一起选择,因为它们按日期显示。因此,如果有人在日期之前或之后搜索 4 天,他们将获得结果,但他们将分散在预订的日期之间。当他们预订时,它将需要 1 整个期间,明白我的意思吗?

也许我没有很好地解释它,对此感到抱歉,但结果必须是一个块/一起,没有任何“中间的预订日期”。

整个查询:

$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)) {

这行得通,但并没有完全达到目标。




可玩的数据:

这些脚本将按照我的方式设置表格......

    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`
4

1 回答 1

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

高温高压

编辑:基于修订问题的新答案

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

这应该有效。我的错,忘了在内部选择周围添加括号。

于 2013-05-14T07:15:33.350 回答