我有一个表,用于存储员工的轮班记录。
简单地说,这里有以下数据:
id = Shift ID
employeenum = Employee Number
start = unix timestamp of shift start time
end = unix timestamp of shift end time
date = YYYY-mm-dd description of date the shift starts on
status = shift status (numeric status identifier)我目前正在通过一个循环的php脚本来确定冲突,但它太慢了。我已经搜索了其他问题,但找不到我想要的答案。
我正在尝试提出一个查询,它基本上会给出一个在给定时间段内具有冲突班次的员工列表。
即2016-07-03至2016-07-10期间,员工具有重叠的状态值为1或7的班次的开始和结束时间戳。
任何帮助都将不胜感激。
谢谢!
编辑
This本质上是表结构。
id是一个主自增量键。该表充满了数字数据。
ID是自动递增的数字,employeenum是6位数字,开始和结束是unix时间戳,日期是YYYY-mm-dd日期格式,覆盖是1或0,状态是1、2、3、4、5、6或7。
Current循环通过查询来工作:
SELECT * FROM schedule WHERE overridden =0 AND date >=$startdate AND date <= $enddate AND (status = 1 OR status = 7) AND employeenum != 0 ORDER BY date ASC然后循环遍历所有这些返回的移位,通过反复执行此查询(使用上面查询结果返回的start和end值)来测试另一个移位是否与它们冲突:
SELECT `employeenum` FROM `schedule` WHERE `overridden` =0 AND `date` >= '$startdate' AND `date` <= '$enddate' AND (`status` = '1' OR `status` = '7') AND ((('$start' > `start`) AND ('$start' < `end`)) OR ((`end` > '$start') AND (`end` < '$end'))) AND `employeenum` = '$employee';"如果有结果,它会将雇员编号推送到有冲突的雇员数组中。然后,这将防止循环再次检查该员工。
在任何给定时间都可能有10,000条记录,因此它正在执行10,000+查询。这些记录仅表示100-200名员工,因此我正在寻找一种方法来查询一次,以查看一个employeenum的两个date值之间是否有任何重叠(start和end与另一个start或end重叠)记录,而不必查询数据库10,000次。
https://stackoverflow.com/questions/38314787
复制相似问题