您能帮我找到查询问题的解决方案吗?我已经坚持了一个星期,所以我决定尝试寻求帮助并学习一些东西。我正在使用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;
这是结果:
我想显示表中所有未使用CHECK-IN和CHECK-OUT日期的房间。
我有:
2个输入:
3张桌子:
现在我有一个查询,检查是否在一定范围内预订了任何房间。 如果日期冲突,它会向我返回带有roomId的预订表。
SELECT
roomId,
bCheckIn,
bCheckOut
FROM booking
WHERE (bCheckOut > ? AND bCheckIn <= ?) AND bStatus = 'Upcoming' OR 'Archived';
首先?是入住日期和秒数?是退房日期输入。 在这里,我传递上述日期并返回在该日期范围内获取的房间。
这是结果:
摘要
是否可以将这两个查询组合在一起,这样我将只获得一个包含第一个查询数据的表,但从第二个查询中排除了那些占用的房间?我的查询合并失败。
答案 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;
结果:
在此示例中,我在BOOKING表中有2个预订的房间,用于登记入住日期“ 2020-06-08”和退房日期“ 2020-06-10”。我为上述查询检查了相同的日期,它只返回了未在给定范围内预订的房间。