提问者:小点点

用于检查日期可用性的子查询


你能帮我找到一个解决我的查询问题的方法吗? 我已经被困在这个问题上一个星期了,所以我决定试着寻求帮助,学点东西。 我正在使用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表:

  • 房间(我带身份证,姓名,价格),
  • 床(I给定房间的床容量总和),
  • 预订(这里我想检查某个房间ID是否被占用)

现在我有了一个查询,它检查在某个范围内是否有任何房间被预订。 如果日期不一致,它会把用RoomID预订的桌子还给我。

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

先? 入住日期和第二? 是签出日期输入。 在此,我传递上述日期,并返回在该日期范围内采取的房间。

这就是结果:

摘要

有没有可能将这两个查询组合在一起,这样我将只得到一个表,第一个查询数据,但从第二个查询中排除那些被占用的房间? 我的查询合并失败。


共1个答案

匿名用户

我认为您希望不存在:

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子句中使用逗号。