我有这个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;这是为了检查房间有预订的时间,如果房间在给定的日期没有预订,那么他们可以自由预订,所以它应该返回免费房间。基本上
答案 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
答案 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)
目前,查询仅排除已在预定时间内预订的房间,而不是预订与请求期间重叠的房间。