繁体   English   中英

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

[英]PHP MySQL query to selecting available room in hotel booking system

目前我正在为酒店预订系统做项目。 这是提供自助登记在系统中的用户和它随机基础上生成的房间号码roomtype选择。 这听起来我的项目对我来说很安静,但我的主管给了我这样做的想法。

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

现在我很困惑选择可用的房间

这是提供的room

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是指系统尚未选择的房间号。 因为room_num由系统随机选择的

以下是table room_booked 以下所有数据均来自rooms表的SQL更新触发器

room_num     roomtype     dor           dco
  102         Single    2014-05-29    2014-05-31
  114         Deluxe    2014-06-01    2014-06-06
  116         Deluxe    2014-06-08    2014-06-11

现在有什么SQL代码从可用房间号room表的基础上,选择roomtype 哪个不在room_booked提到的登记日期和结账日期之间?

提前致谢

正如我在评论中已经说过的,我更喜欢另一种数据库结构。 所以我先创建了table roomroom_booked

-- 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语句。 在此示例中,用户希望在2014-06-01预订Deluxe客房。

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
;

如果您只在ORDER BY之前参加,您将获得2014-06-01Deluxe房间列表。

这听起来像你想要的东西:

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

SELECT
    room_num
FROM
    room
WHERE
    room_num NOT IN(SELECT room_num FROM room_booked)
    AND roomtype = {ROOMTYPE}
ORDER BY RAND() LIMIT 1

解决方案2

SELECT
    room_num
FROM
    room
WHERE
    dor != '0000-00-00' AND dco != '0000-00-00'
    AND roomtype = {ROOMTYPE}
ORDER BY RAND() LIMIT 1

你必须随机选择房间,你将在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

因此,它将从可用的房间中选择一个随机房间

暂无
暂无

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

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