[英]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 room
和room_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-01
的Deluxe
房间列表。
这听起来像你想要的东西:
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.