子查询以检查日期可用性

时间:2020-06-08 12:14:23

标签: mysql sql

您能帮我找到查询问题的解决方案吗?我已经坚持了一个星期,所以我决定尝试寻求帮助并学习一些东西。我正在使用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;

这是结果:

First query

我想显示表中所有未使用CHECK-IN和CHECK-OUT日期的房间。

我有:

2个输入:

  • 入住日期
  • 退房日期

3张桌子:

  • 房间(我输入身份证,姓名,价格)
  • 床(我等于给定房间中床的容量)
  • 预订(在这里我要检查是否已获取某些roomId)

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

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

首先?是入住日期和秒数?是退房日期输入。 在这里,我传递上述日期并返回在该日期范围内获取的房间。

这是结果:

enter image description here

摘要

是否可以将这两个查询组合在一起,这样我将只获得一个包含第一个查询数据的表,但从第二个查询中排除了那些占用的房间?我的查询合并失败。

2 个答案:

答案 0 :(得分:1)

我认为您想要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子句中使用逗号。

答案 1 :(得分:0)

这是我与Gordon Linoff建议结合的查询

SELECT r.rid            AS 'ID', 
   r.rname          AS 'Room Type', 
   r.rprice         AS 'Price (THB)', 
   Sum(b.bcapacity) AS 'Max Guests' 
FROM   room r 
       LEFT JOIN bed b 
              ON r.rid = b.roomid 
WHERE  NOT EXISTS (SELECT 1 
                   FROM   booking bo 
                   WHERE  bo.roomid = r.rid 
                          AND bo.bcheckin < ? 
                          AND bo.bcheckout >= ?) 
GROUP  BY roomid; 

结果:

enter image description here

在此示例中,我在BOOKING表中有2个预订的房间,用于登记入住日期“ 2020-06-08”和退房日期“ 2020-06-10”。我为上述查询检查了相同的日期,它只返回了未在给定范围内预订的房间。

相关问题