首页 > 解决方案 > 尝试查询酒店的数据库以返回 SQLZOO 上特定日期的未占用房间的 ID

问题描述

我要回答的问题要我查询数据库:列出 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 guest ON guest_id = guest.id
WHERE booking_date = '2016-11-25' AND guest_id IS NULL

当我应该得到房间 ID 207、210、304 时,我仍然得到没有值的表头。

我确定我错过了一些东西,但我只是看不到什么,非常感谢任何帮助。

https://sqlzoo.net/wiki/Guest_House_Assessment_Hard

谢谢 :)

UML 图

标签: sql

解决方案


尽管您的 SQL 查询不正确(您可以检查 ifoccupants IS NULL但不能将它们与=运算符进行比较),但您正在执行INNER JOIN,它只会返回两个表中匹配的行。

当天没有预订的房间不应该有关联的预订,因为没有人进行预订。您必须在 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。


推荐阅读