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