检查新间隔是否重叠-MySQL(或PHP)
我一直在思考如何简化这里提出的问题 在它的核心,减去所有与日期有关的奇妙的魔法,这只是一个检查重叠间隔的问题。毕竟,日期可以被认为是数字,这可能会使逻辑更简单。想象下表:检查新间隔是否重叠-MySQL(或PHP),php,mysql,scheduling,intervals,Php,Mysql,Scheduling,Intervals,我一直在思考如何简化这里提出的问题 在它的核心,减去所有与日期有关的奇妙的魔法,这只是一个检查重叠间隔的问题。毕竟,日期可以被认为是数字,这可能会使逻辑更简单。想象下表: Schedules schedule_id | start | end 1 | 1 | 3 2 | 4 | 7 3
Schedules
schedule_id | start | end
1 | 1 | 3
2 | 4 | 7
3 | 8 | 13
4 | 15 | 16
5 | 18 | 24
6 | 25 | 28
我试图插入一个新的间隔,这样[a,b]就不会与任何其他间隔重叠。考虑事项:
是的,我可以将整个表拉入一个数组,并对其进行搜索。那太无聊了。
我更喜欢在MySQL中这样做,这样我就不必每次都下拉一个任意大的表。
请参见下图。这表示可以插入和不能插入的内容的界限 您可以将插入语短语设置为:
insert into schedules(start, end)
select s, e
from (select $start s, $end as e) t
where not exists (select 1
from schedules s2
where s.start <= t.end and s.end >= t.start
);
仅当值不与表中的现有行重叠时,才会插入该值。使用以下缩写: [旧]:=现有范围 [新]:=插入范围 OS:=旧的现有_范围。开始 OE:=旧的现有_范围。结束 NS:=新插入范围。开始 NE:=新插入范围。结束 新旧两个范围重叠的条件是:OS
如果新范围完全位于现有范围之前或之后,则不存在重叠:[new]要插入的间隔是多少?如果只需要任何值,则选择最大结束值并为开始添加一个值。然后,您可以将“结束”设置为更大的值。@GordonLinoff-我想插入一个任意间隔,这样就不会与任何其他间隔发生冲突。间隔可以是任意长度。根据我发布的图片,顶部的小间隔将是有效的,因为它不冲突,而在底部,我试图表示我能想到的所有可能的冲突。基本上,我的新时间间隔是运行到还是包含在现有的任何内容中?我的新间隔中是否有任何内容?从计划中选择*,其中start=16将返回您建议的插入冲突的所有间隔。这在蓝色的情况下不起作用。当然,我们从开始=17的日程表中选择*但是橙色包含在蓝色想要去的地方。这也不能避免查找时的错误。我从查询中得到了所有这些行,但我仍然必须对它们进行搜索。行1是否重叠?第2行是否重叠,第3行是否重叠…在蓝色的情况下,开始=14。在任何情况下,它都是有效的。
(NE <= OS) OR (OE <= NS)
!( (NE <= OS) OR (OE <= NS) )
!(NE <= OS) AND !(OE <= NS)
(NE > OS) AND (OE > NS)
(OS < NE) AND (OE > NS)
SELECT o.*
FROM Schedules o
WHERE o.start < :new_end
AND o.end > :new_start