SQL逻辑错误

时间:2014-07-27 22:04:23

标签: mysql sql

我有这个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在哪里出错?

编辑:&#34; sql实际上做了什么?&#34;这是为了检查房间有预订的时间,如果房间在给定的日期没有预订,那么他们可以自由预订,所以它应该返回免费房间。基本上

2 个答案:

答案 0 :(得分:3)

加雷特是如此正确。 但是:你的查询比它需要的更复杂。

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

答案 1 :(得分:2)

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

你应该有 WHERE(arr_date&lt; =:outd AND dep_date&gt; =:ind)OR(dep_date&gt; =:ind AND arr_date&lt; = outd)

目前,查询仅排除已在预定时间内预订的房间,而不是预订与请求期间重叠的房间。