计算 PHP 或 MySQL 范围内的最大重叠事件
Calculate maximum overlapping events within a range in PHP or MySQL
以前可能有人问过这个问题,但我的搜索结果很短。想象一个汽车预订系统,我可以随时租用三辆车。
如何使用 PHP 和 MySQL 5.7,确保在新预订的时间范围内不超过此限制?
我找到了 ,但我不确定如何解决 MySQL 5.7 不支持 window 函数的问题。
我可以加载所有冲突的预留,并使用 PHP 在一个间隔内逐步计算哪些预留在该间隔发生冲突并取最大值,但我认为这是一个常见问题更好的解决方案。
信息
- 数据库将
start_time
和 end_time
存储为 TIMESTAMP
数据类型。
- 需要每隔 1 分钟检查一次范围的开始和结束。
图表
所以要检查特定时刻,您可以:
select count(1) conflicts
from events
where start_time <= desired_time && end_time > desired_time;
要找到所需时间范围内的最大冲突数,您无需每分钟检查一次,只需在每个时间段的开始时间(或所需的开始时间,如果较晚)检查冲突事件:
select coalesce(max(conflicts),0) max_conflicts
from (
select count(1) conflicts
from (
select distinct greatest(DESIRED_START_TIME, start_time) desired_time
from events
where start_time < DESIRED_END_TIME && end_time > DESIRED_START_TIME
) conflicting_events
join events on start_time <= desired_time && end_time > desired_time
) point_in_time_conflicts;
(未经测试)
以前可能有人问过这个问题,但我的搜索结果很短。想象一个汽车预订系统,我可以随时租用三辆车。
如何使用 PHP 和 MySQL 5.7,确保在新预订的时间范围内不超过此限制?
我找到了
我可以加载所有冲突的预留,并使用 PHP 在一个间隔内逐步计算哪些预留在该间隔发生冲突并取最大值,但我认为这是一个常见问题更好的解决方案。
信息
- 数据库将
start_time
和end_time
存储为TIMESTAMP
数据类型。 - 需要每隔 1 分钟检查一次范围的开始和结束。
图表
所以要检查特定时刻,您可以:
select count(1) conflicts
from events
where start_time <= desired_time && end_time > desired_time;
要找到所需时间范围内的最大冲突数,您无需每分钟检查一次,只需在每个时间段的开始时间(或所需的开始时间,如果较晚)检查冲突事件:
select coalesce(max(conflicts),0) max_conflicts
from (
select count(1) conflicts
from (
select distinct greatest(DESIRED_START_TIME, start_time) desired_time
from events
where start_time < DESIRED_END_TIME && end_time > DESIRED_START_TIME
) conflicting_events
join events on start_time <= desired_time && end_time > desired_time
) point_in_time_conflicts;
(未经测试)