我有一个表存储员工的轮类记录。
简单来说,有以下数据:
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。
当前循环通过查询来工作:
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 名员工,因此我正在寻找一种方法来查询一次,看看是否有任何重叠(start
和 end
与另一个 start
或 end
)记录一个 employeenum
的两个 date
值之间的记录,而无需查询数据库 10,000 次。
最佳答案
此查询将为您提供类次 ID、日期、员工编号、冲突员工编号以及冲突类次计数。您的数据集中有大量冲突的转变!!!
SELECT `schedule_test`.`id`, `schedule_test`.`date`, `schedule_test`.`employeenum`, GROUP_CONCAT(DISTINCT`join_tbl`.`employeenum`), COUNT(`join_tbl`.`employeenum`)
FROM `schedule_test`
INNER JOIN `schedule_test` AS `join_tbl` ON
`schedule_test`.`date` = `join_tbl`.`date`
AND (`join_tbl`.`status` = 1 OR `join_tbl`.`status` = 7)
AND (`join_tbl`.`start` BETWEEN `schedule_test`.`start` AND `schedule_test`.`end`
OR `join_tbl`.`end` BETWEEN `schedule_test`.`start` AND `schedule_test`.`end`)
AND `schedule_test`.`id` != `join_tbl`.`id`
WHERE (`schedule_test`.`status` = 1 OR `schedule_test`.`status` = 7)
GROUP BY `schedule_test`.`id`
ORDER BY `schedule_test`.`date`
关于php - MySQL 查询以确定重叠时间戳 - 调度系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38314787/