首页 > 解决方案 > 检查日期可用性的子查询

问题描述

你能帮我找到我的查询问题的解决方案吗?我已经坚持了一周,所以我决定尝试寻求帮助并学习一些东西。我正在使用 MySQL 数据库。

现在我有一张没有“搜索功能”的桌子。

SELECT
    r.rId,
    r.rName,
    r.rPrice,
    b.capacity
FROM
   room r,
   (SELECT roomId, SUM(bCapacity) AS capacity FROM bed GROUP BY roomId) AS b
WHERE r.rId = b.roomId;

这是结果:

第一次查询

我想在表格中显示在入住和退房日期内未入住的所有房间。

我有:

2 个输入:

3张桌子:

现在我有一个查询,检查是否在某个范围内预订了任何房间。如果日期发生冲突,它会从带有 roomId 的预订中返回给我的表格。

SELECT
    roomId,
    bCheckIn,
    bCheckOut
FROM booking
WHERE (bCheckOut > ? AND bCheckIn <= ?) AND bStatus = 'Upcoming' OR 'Archived';

第一的 ?是入住日期和第二个?是退房日期输入。在这里,我通过上述日期并返回在该日期范围内拍摄的房间。

这是结果:

在此处输入图像描述

概括

是否可以将这两个查询结合起来,这样我只会得到一个带有第一个查询数据的表,但不包括从第二个查询中占用的房间?我的查询合并失败。

标签: mysqlsql

解决方案


我想你想要not exists

select r.*
from rooms r
where not exists (select 1
                  from booking b
                  where b.roomid = r.id and
                        b.checkindate < :end_date and
                        b.checkoutdate >= :start_date
                 );

如果你正在学习 SQL,你应该学习正确的、明确的、标准的、可读的JOIN语法。 切勿FROM子句中使用逗号。


推荐阅读