【问题标题】:Error in SQL logicSQL 逻辑错误
【发布时间】:2014-07-27 22:04:22
【问题描述】:

我有这个 SQL 查询:

SELECT r.room_id AS room_id, 
       room_name, 
       num_rooms, 
       max_people, 
       min_rate 
FROM   room r 
       LEFT JOIN(SELECT b.room_id, 
                        accom_id, 
                        COALESCE(Count(b . room_id), 0) AS bookings 
                 FROM   booking b 
                 WHERE  arr_date >= :ind 
                        AND dep_date <= :outd 
                 GROUP  BY room_id) t 
              ON( t.accom_id = r.accom_id 
                  AND r.room_id = t.room_id ) 
WHERE  r.accom_id = :id 
       AND ( t.bookings < num_rooms 
              OR t.bookings IS NULL ) 
GROUP  BY room_name

与以下 SQL 表有关:

它在预订表中有此信息用于测试目的:

问题是:

当我运行 :ind 是 2014-07-27 和 :outd 是 2014-07-29 的查询时,我没有得到任何回报,这正是我所期望的!但是,如果我将日期更改为 2014-07-28(:ind) 和 2014-07-29(:outd)

两个房间都还给我了!这是不正确的。 Room_id 2 应该返回给我,因为之前的客人会在 28 日离开,所以 28-29 是免费的,但 room_id 1 不应该是可用的,因为客人在 29 日之前仍然在其中。

如何解决这个逻辑错误?我的 SQL 哪里出错了?

编辑:“sql 实际上做了什么?”它的目的是检查房间何时有预订,如果房间在给定日期没有预订,则可以免费预订,因此它应该返回免费房间。基本上。

【问题讨论】:

  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • 你的列是什么类型的?

标签: mysql sql


【解决方案1】:

加雷特永远是对的。 而且:您的查询比它需要的更复杂。

SELECT r.room_id AS room_id, 
       room_name, 
       num_rooms 
FROM   room r 
WHERE  (SELECT Count(*) 
        FROM   booking b 
        WHERE  b.room_id = r.room_id 
               AND b.accom_id = r.accom_id 
               AND ( arr_date BETWEEN @ind AND @outd 
                      OR dep_date BETWEEN @ind AND @outd )) < num_rooms

http://sqlfiddle.com/#!2/d67fb5/1

【讨论】:

    【解决方案2】:

    在具有 :ind 和 :outd 参数的 where 子句中出错了。

    你应该有 WHERE (arr_date = :ind) 或 (dep_date >= :ind AND arr_date

    目前,查询只排除在请求时间段内已经预订的房间,而不是与请求时间段有重叠预订的房间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多