正在尝试查询酒店数据库,以返回SQLZOO上特定日期未占用房间的id
我试图回答的问题需要我向DB查询: 列出2016年11月25日当天的免费房间 这就是我到目前为止所做的正在尝试查询酒店数据库,以返回SQLZOO上特定日期未占用房间的id,sql,Sql,我试图回答的问题需要我向DB查询: 列出2016年11月25日当天的免费房间 这就是我到目前为止所做的 SELECT room_no FROM booking b JOIN room ON b.room_no = room.id WHERE booking_date = '2016-11-25' AND occupants IS NULL 我已将其修改为: SELECT room_no FROM booking b JOIN room ON b.room_no = room.id JOIN g
SELECT room_no FROM booking b
JOIN room ON b.room_no = room.id
WHERE booking_date = '2016-11-25' AND occupants IS NULL
我已将其修改为:
SELECT room_no FROM booking b
JOIN room ON b.room_no = room.id
JOIN guest ON guest_id = guest.id
WHERE booking_date = '2016-11-25' AND guest_id IS NULL
我仍然得到没有值的表头,而我应该得到房间ID 207210304
我肯定我遗漏了什么,但我就是看不出有什么,非常感谢您的帮助
谢谢:
您没有考虑夜数,因此逻辑更像这样:
SELECT room_no
FROM room r LEFT JOIN
booking b
ON b.room_no = room.id AND
'2016-11-25' < booking_date + interval nights day AND
'2016-11-25' >= booking_date
WHERE b.room_no IS NULL;
尽管您的SQL查询不正确,但您可以检查占用者是否为NULL,但不能将其与=运算符进行比较,您正在执行内部联接,这将只返回两个表中匹配的行 当天未预订的房间不应关联预订,因为没有人预订。您必须在11月25日或该日期之前预订未预订的房间,并在该日期之后预订 您可以通过子查询获得所需内容:
SELECT id FROM room
WHERE id NOT IN
(SELECT room_no FROM booking
WHERE (DATE_ADD(booking_date, INTERVAL nights DAY) > '2016-11-25'
AND booking_date <= '2016-11-25'))
我假设您使用的是MariaDB,因此我使用了DATE_ADD函数,因为这是SQLZOO似乎基于的DBMS。为空!请使用您正在使用的数据库进行标记。使用SQL标记的问题的答案应使用ISO/IEC标准SQL-这应该是可行的。SQLzoo有一个奇怪的命名约定。表名使用复数。表存储关于许多项的数据。列名使用单数。非常感谢。这是不正确的。尽管缺少AND在语法上是不正确的,并且没有空格为NULL,并且使用了错误的字段名,但是您应该在第二个字段中添加nights而不是Subtraction并使用=。