繁体   English   中英

MYSQL / PHP帮助 - 从原始预订的任一侧的表中选择下一个可用日期

[英]MYSQL / PHP Help - Selecting next available dates from a table either side of original booking

我已经制作了这张表,其中包含了截至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天,他们将获得结果,但它们将在预订日期之间展开。 当他们预订时,需要一整个时期,看看我的意思是芽?

也许我并没有很好地解释它,所以很抱歉,但结果必须在一块/一起,没有任何“预定的日期”。

完整的查询:

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

只需从头顶打字。

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

HTH

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

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

这应该工作。 我的坏,忘了在内部选择周围添加括号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM