如何在单表中筛选calendar_id=1且与calendar_id=2无时间重叠的事件
解决日历事件无重叠筛选问题
嘿,我来帮你搞定这个需求!你要从现有表中找出calendar_id=1的所有事件,并且这些事件和calendar_id=2的任何事件都没有时间重叠对吧?下面给你两种实用的SQL实现思路,都能满足你的需求:
方法一:使用NOT EXISTS子查询
这是最直观的写法,核心逻辑是:对每个calendar_id=1的事件,检查是否存在与之重叠的calendar_id=2事件,不存在的就保留下来。
SELECT event_id, start, end FROM your_table_name cal1 WHERE cal1.calendar_id = 1 AND NOT EXISTS ( SELECT 1 FROM your_table_name cal2 WHERE cal2.calendar_id = 2 -- 时间重叠的判断条件:两个事件的时间区间有交集 AND cal1.start < cal2.end AND cal1.end > cal2.start );
方法二:使用LEFT JOIN + NULL判断
这种方法通过左连接关联重叠事件,然后筛选出没有匹配到重叠事件的记录:
SELECT DISTINCT cal1.event_id, cal1.start, cal1.end FROM your_table_name cal1 LEFT JOIN your_table_name cal2 ON cal2.calendar_id = 2 AND cal1.start < cal2.end AND cal1.end > cal2.start WHERE cal1.calendar_id = 1 AND cal2.event_id IS NULL;
举个例子验证
用你给出的示例数据:
| event_id | calendar_id | start | end |
|---|---|---|---|
| 101 | 1 | 1/1/10 20:00 | 1/1/10 22:00 |
| 102 | 2 | 1/1/10 20:00 | 1/1/10 21:00 |
| 103 | 1 | 1/1/10 22:00 | 1/2/10 02:00 |
运行上面的SQL后,只会返回event_id=103的记录——因为101和102的时间区间有重叠,而103的开始时间刚好是102的结束时间,属于无重叠的情况。
内容的提问来源于stack exchange,提问作者ravid007
相关产品推荐
相关产品推荐

