sql - 尝试查询酒店的数据库以返回 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
谢谢 :)
解决方案
尽管您的 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。
推荐阅读
- spring - @EnableBinding @deprecated 自 3.1 起支持函数式编程模型
- python - 我们如何将 CSV 数据从 CPP 发送到 python 脚本
- python - 在 Python 中编写带参数的装饰器
- android - 是什么让代码中不同的权限请求位置改变了 android 应用程序的行为
- sql - 将公式应用于列时使用 CASE 的 sql 查询出错
- java - STS 4.9.0 中 OSGI 资源的类路径问题
- c# - 这个服务器解决方案是最优的吗?
- reactjs - 键入 NextJs 链接/路线
- hive - Sqoop 从 hive 表导出到 teradata 表
- ios - AVAssetWriter 中断 TCP 连接