我的数据库中有两个表。第一张桌子是房间,第二张桌子是预订。在我的房间表中
id room_no type rate
1 13 1b 1000
2 14 2b 2000
3 15 3b 3000
4 16 1b 1000
5 17 2b 2000
6 18 3b 3000
在我的预订表中
id room_no check_in check_out
1 13 23-2-2016 24-2-2016
2 14 24-2-2016 25-2-2016
1 13 25-2-2016 26-2-2016
1 13 27-2-2016 29-2-2016
1 13 1-3-2016 2-3-2016
1 13 7-3-2016 7-3-2016
"SELECT room_no,type,rate
FROM room
WHERE room_no not in
(select IFNULL(GROUP_CONCAT(room_no),0)
FROM reservation
WHERE check_out >= '$check_in' AND check_in <= '$check_out')"
当我选择24-2-2016到27-2-2016的日期时,它会显示
room_no check_in check_out
14 24-2-2016 25-2-2016
15 25-2-2016 26-2-2016
16 27-2-2016 29-2-2016
17 1-3-2016 2-3-2016
18 7-3-2016 7-3-2016
但我想要所有可用的房间。
答案 0 :(得分:4)
要获得指定期间的占用房间,即'2016-02-27'-'2016-02-24'
,您可以使用:
SELECT DISTINCT room_no
FROM reservation
WHERE check_in <= '2016-02-27' AND check_out >= '2016-02-24'
<强>输出:强>
room_no
=======
13
14
要获得可用的房间,您可以使用上述查询:
SELECT *
FROM room
WHERE room_no NOT IN (
SELECT DISTINCT room_no
FROM reservation
WHERE check_in <= '2016-02-27' AND check_out >= '2016-02-24')
<强>输出:强>
id, room_no, type, rate
=======================
3, 15, 3b, 3000
4, 16, 1b, 1000
5, 17, 2b, 2000
6, 18, 3b, 3000
答案 1 :(得分:0)
你应该使用这样的东西:
"SELECT room_no, type, rate
FROM room
WHERE room_no not in
(select room_no FROM reservation
WHERE ('$check_in' BETWEEN check_in AND check_out) AND ('$check_out' BETWEEN check_in AND check_out))"
我不知道查询是否正确,但你肯定要检查它们之间。 你不能只测试check_out&gt;比日期和check_in&lt;日期。如果您有多个预订,这将给您错误!!
答案 2 :(得分:0)
使用LEFT JOIN
应该不使用子查询就可以了。
这样的事情:
SELECT
room.room_no,
room.`type`,
room.rate,
COUNT(reservation.room_no) AS countReservation
FROM
room
LEFT JOIN reservation
ON (room.room_no = reservation.room_no)
AND (check_in <= '2016-02-24' AND check_out >= '2016-01-27')
GROUP BY
room.room_no
HAVING
countReservation = 0
此查询的另一个优势是额外的列countReservation
,它甚至可以告诉您是否有针对每个会议室的给定时间范围的1个或多个预订。