酒店预订系统中选择可用房间的PHP MySQL查询

酒店预订系统中选择可用房间的PHP MySQL查询,php,mysql,sql,Php,Mysql,Sql,目前我正在做酒店预订系统的项目。为用户提供自助入住系统,根据选择的房间类型随机生成房间号。对我来说,我的项目听起来很奇怪,但我的主管给了我这样做的想法 到目前为止,我已经完成了自助入住系统,并随机生成了房间号 现在我在选择可用的房间时感到困惑 这是提供的房间桌子 dor是预订日期或入住日期 dco是结帐日期 room_num roomtype dor dco 101 Single 0000-00-00 0000-00-00

目前我正在做酒店预订系统的项目。为用户提供自助入住系统,根据选择的房间类型随机生成房间号。对我来说,我的项目听起来很奇怪,但我的主管给了我这样做的想法

到目前为止,我已经完成了自助入住系统,并随机生成了房间号

现在我在选择可用的房间时感到困惑

这是提供的房间桌子

dor是预订日期或入住日期

dco是结帐日期

room_num     roomtype     dor            dco
  101         Single    0000-00-00    0000-00-00
  102         Single    2014-05-29    2014-05-31
  103         Single    0000-00-00    0000-00-00
  111         Deluxe    0000-00-00    0000-00-00
  112         Deluxe    0000-00-00    0000-00-00
  113         Deluxe    2000-00-00    0000-00-00
  114         Deluxe    2014-06-01    2014-06-06
  115         Deluxe    0000-00-00    0000-00-00
  116         Deluxe    2014-06-08    2014-06-11
  121         Superior  0000-00-00    0000-00-00
  122         Superior  0000-00-00    0000-00-00
0000-00-00表示系统尚未选择的房间号。因为房间数量是由系统随机选择的

下面是您预订的桌子房间。以下所有数据均来自rooms表中的SQL更新触发器

现在,根据所选的roomtype,从room表中选择可用房间号的SQL代码是什么。哪一个不在所预订房间上提到的入住日期和退房日期之间


提前感谢

听起来您想要的是:

SELECT TOP 1 ROOM_NUM
FROM TABLE_NAME
WHERE roomtype=varRoomType AND
      dor=0000-00-00
现在我认为TOP 1是一个mysql的东西,如果您使用oracle,我认为您必须在where子句中添加一个rownumber=1。但这会让您找到第一个与特定房间类型匹配的开放式房间。

您可以尝试:

SELECT room_num 
from room 
where roomtype = $roomtype 
and $room_booked 
not between dor and dco

这应该会抓住在这两个日期之间当前未预订的任何房间。

我从您的问题陈述中了解到的是,您需要SQL语句,它将提供所有当前可用的房间进行预订

这可能有两种解决方案

解决方案1

解决方案2


您必须随机选择房间,并在mysql中提供房间类型,您可以使用此查询

SELECT * FROM room where roomtype='your_given_room_type' and dor='0000-00-00' and dco='0000-00-00' ORDER BY RAND() LIMIT 1

因此,它将从可用的房间中随机选择一个房间,正如我在我的中已经说过的,我更喜欢另一个数据库结构。所以我先创建了房间和房间的桌子

并用你的原始数据填充它们

INSERT INTO room (room_num, roomtype) VALUES (101, 'Single');
INSERT INTO room (room_num, roomtype) VALUES (102, 'Single');
INSERT INTO room (room_num, roomtype) VALUES (103, 'Single');
INSERT INTO room (room_num, roomtype) VALUES (111, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (112, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (113, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (114, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (115, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (116, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (121, 'Superior');
INSERT INTO room (room_num, roomtype) VALUES (122, 'Superior');

INSERT INTO room_booked (id, room_num, dor, dco) VALUES (1, 102, '2014-05-29', '2014-05-31');
INSERT INTO room_booked (id, room_num, dor, dco) VALUES (2, 114, '2014-06-01', '2014-06-06');
INSERT INTO room_booked (id, room_num, dor, dco) VALUES (3, 116, '2014-06-08', '2014-06-11');
现在是SELECT语句。在本例中,用户希望在2014-06-01预订豪华客房


如果您只在订购前购买该部分,您将在2014-06-01获得一份豪华客房列表。

谷歌,您有没有尝试过、研究过?我们所看到的只是表结构,没有任何尝试。在您的情况下,需要使用子句。其中$date不在dor和dco之间$日期是当前日期房间\预订的数据来自房间表中更新后的触发器。系统可能选择了具有不同dor和dco的同一房间,以及用于存储房间号和预订日期的room_booked table搜索SQL日期重叠查询。对于未知日期,不要使用0000-00-00。sql null将是更好的选择。0000-00-00,虽然不是很明显。就mysql而言,仍然是一个有效日期。最有可能的$room_booked实际上是两个日期:签入和签出。什么是$room_booked,类似于从room booked中选择列还是其他什么?$room_booked是传递到查询中的参数。大概是日期格式。您必须在您的PHP中填充该日期。2014-06-01是客人选择的入住日期吗?是的。在本例中,用户希望在2014-06-01预订豪华客房。我刚刚编辑了答案。我认为,在WHERE条件“2014-06-01'>dco”中使用>=而不是>,是有意义的。因为通常,当客人退房时,房间可以在同一天使用/预订。我只是在这个案例中进行了测试。从8月1日到8月6日,所有豪华房间都住满了。然后,豪华酒店的三间客房已于6月预订,并于6月退房。我通过选择从8月1日到6日的日期范围尝试了您的代码。但是,它显示的是6月份预订的房间号,而不是0或已全部预订。我已复制了错误。请稍等,我正在修理。问题是左联接-它考虑了所有的表空间条目,并且对于每个条目,还考虑了来自表空间的一个条目。因此,可能会出现这样的情况:对于一个房间,预订的房间_中有多个条目,并且只考虑其中一个条目。例如,115房间的id=4 dor=2014-05-25 dco=2014-08-30和id=5 dor=2014-04-01 dco=2014-04-03。当只考虑最后一个时,请求选择。。。如果“2014-06-01”=dco也将归还实际预订的房间。
SELECT
    room_num
FROM
    room
WHERE
    dor != '0000-00-00' AND dco != '0000-00-00'
    AND roomtype = {ROOMTYPE}
ORDER BY RAND() LIMIT 1
SELECT * FROM room where roomtype='your_given_room_type' and dor='0000-00-00' and dco='0000-00-00' ORDER BY RAND() LIMIT 1
-- DROP TABLE IF EXISTS room_booked;
-- DROP TABLE IF EXISTS room;

CREATE TABLE room (
    room_num INT NOT NULL,
    roomtype ENUM('Single', 'Deluxe', 'Superior') NOT NULL,
    PRIMARY KEY (room_num)
) ENGINE=InnoDB;
CREATE TABLE room_booked(
    id INT NOT NULL,
    room_num INT NOT NULL,
    dor DATE NOT NULL,
    dco DATE NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (room_num) REFERENCES room(room_num)
) ENGINE=InnoDB;
INSERT INTO room (room_num, roomtype) VALUES (101, 'Single');
INSERT INTO room (room_num, roomtype) VALUES (102, 'Single');
INSERT INTO room (room_num, roomtype) VALUES (103, 'Single');
INSERT INTO room (room_num, roomtype) VALUES (111, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (112, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (113, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (114, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (115, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (116, 'Deluxe');
INSERT INTO room (room_num, roomtype) VALUES (121, 'Superior');
INSERT INTO room (room_num, roomtype) VALUES (122, 'Superior');

INSERT INTO room_booked (id, room_num, dor, dco) VALUES (1, 102, '2014-05-29', '2014-05-31');
INSERT INTO room_booked (id, room_num, dor, dco) VALUES (2, 114, '2014-06-01', '2014-06-06');
INSERT INTO room_booked (id, room_num, dor, dco) VALUES (3, 116, '2014-06-08', '2014-06-11');
SELECT
    room_num, roomtype
FROM
    room
WHERE
    room_num NOT IN (
        SELECT
            room.room_num
        FROM
            room
        LEFT OUTER JOIN
            room_booked ON room_booked.room_num = room.room_num
        WHERE
            -- room type
            roomtype != 'Deluxe'
            OR (
                -- wished booking date is after or at the DOR date
                '2014-06-01' >= dor
                -- OR wished booking date is before the DCO date
                AND '2014-06-01' <  dco
            )
    )
ORDER BY
    RAND()
LIMIT 0, 1
;