Mysql 如何在酒店预订系统中准确查询未预订房间?
我正在用php和mysql做酒店预订系统的项目 我创建了下面的rooms表Mysql 如何在酒店预订系统中准确查询未预订房间?,mysql,sql,Mysql,Sql,我正在用php和mysql做酒店预订系统的项目 我创建了下面的rooms表 room_no| roo_id | room_type D1 | 1 | Deluxe R1 | 2 | AC R2 | 3 | Non Ac C1 | 4 | Cottage 这张表是关于房间的,代表酒店的总房间数 这是客户预订台 customer_id | Cust_name | email | Address | room_type
room_no| roo_id | room_type
D1 | 1 | Deluxe
R1 | 2 | AC
R2 | 3 | Non Ac
C1 | 4 | Cottage
这张表是关于房间的,代表酒店的总房间数
这是客户预订台
customer_id | Cust_name | email | Address | room_type | room_no| cost|check_in | check_out
1 | satyawan |ss@gmail.com| xy | AC | R1 |5000 | 2012-12-26|2012-12-30
2 |satyawan | lahu@gmail.com|unr | Non A/C | R6 | 20002012-01-01|2012-12-07
3 |satyawan | lahu@gmail.com|unr | Non A/C | R8 | 2013-01-01 |2013-01-10
4 |satyawan | lahu@gmail.com|unr | Non A/C | R9 | 2013-01-10 |2013-01-16
5 |satyawan | lahu@gmail.com|unr | Non A/C | R6 | 2013-01-01 |2013-01-20
我已经对这两个表的联接启动了查询,以获取未预订房间的排序数据。查询如下
SELECT *
FROM rooms
LEFT JOIN customer_booking
ON customer_booking.room_no = rooms.room_no
WHERE customer_booking.client_id IS NULL
OR (customer_booking.check_out >= 2013-01-01
AND customer_booking.check_in >= 2013-01-10)
OR (customer_booking.check_out <= 2013-01-01
AND customer_booking.check_out <= 2013-01-10)
选择*
从房间
左加入客户预订
客户预订时。房间号=房间号
其中customer\u booking.client\u id为空
或(客户预订。退房>=2013-01-01
和客户(预订。入住>=2013-01-10)
或者(customer\u booking.check\u out也许您正在寻找不在
SELECT * FROM rooms AS r WHERE r.room_no NOT IN (
SELECT cb.room_no FROM customer_booking AS cb WHERE your_checkin_constraints);
尝试使用此查询。如果最后一个字段room\u customer\u id
为0,则room是免费的,否则将显示预订此房间的客户id
SELECT rooms.*,COALESCE(customer_booking.customer_id,0) room_customer_id
FROM rooms
LEFT JOIN customer_booking ON
(customer_booking.room_no = rooms.room_no)
and
(
('2013-01-01' between customer_booking.check_in and customer_booking.check_out)
or
('2013-01-10' between customer_booking.check_in and customer_booking.check_out)
or
(customer_booking.check_in between '2013-01-01' and '2013-01-10')
)
选择r.room,如果r.room\u no为空,则选择“可用”
否则“不可用”结束
从r房间
左加入客户预订cb
在cb.room\U no=r.room\U no上
还有,像这样试试,你会得到d间没有预订的房间
SELECT * FROM room r WHERE
not exists (
SELECT cb.room_no FROM customer_booking cb where cb.room_no=r.room_no);
子选择与实际的左连接和空(或非空)测试相比,在性能上非常糟糕@DRapp:通常但不总是。非常接近……他正在寻找第1-10个占用范围,在in/out之间添加2013-01-10,您应该会很好。@DRapp我已修复此查询。谢谢
SELECT * FROM room r WHERE
not exists (
SELECT cb.room_no FROM customer_booking cb where cb.room_no=r.room_no);