关联3张MySQL表,查询指定日期的可用时段
查询指定日期的可用时段
要实现列出指定日期的可用时段,核心思路是生成该日期下所有可能的时段,再排除已被预订的时段。以下是具体的MySQL查询方案:
基础查询语句
假设要查询的日期ID是@target_date_id(比如示例中的1或2),可以使用以下语句:
SELECT bt.id, bt.time FROM bookings_times bt CROSS JOIN bookings_dates bd WHERE bd.id = @target_date_id AND NOT EXISTS ( SELECT 1 FROM bookings b WHERE b.date_requested = bd.id AND b.time_requested = bt.id );
语句解释
- CROSS JOIN bookings_dates:将目标日期与所有时段关联,生成该日期下的所有可能时段组合。
- NOT EXISTS子查询:检查该时段是否已被预订,若没有对应预订记录,则保留该时段,即为可用时段。
示例测试
- 查询日期ID为1时:
将@target_date_id替换为1,由于日期1的两个时段(9:00和9:15)均被预订,查询结果为空。 - 查询日期ID为2时:
将@target_date_id替换为2,此时仅时段2(9:15)被预订,返回结果:id | time 1 | 9:00
可选优化:按实际日期查询
如果需要直接使用实际日期(如2022-11-06)而非日期ID查询,可修改语句:
SELECT bt.id, bt.time FROM bookings_times bt JOIN bookings_dates bd ON bd.id = bt.id WHERE bd.date = '2022-11-06' AND NOT EXISTS ( SELECT 1 FROM bookings b WHERE b.date_requested = bd.id AND b.time_requested = bt.id );
内容的提问来源于stack exchange,提问作者michaelmcgurk
相关产品推荐
相关产品推荐

