php - MySQL 查询以确定重叠时间戳 - 调度系统

标签 php mysql database

我有一个表存储员工的轮类记录。

简单来说,有以下数据:

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

然后,它会循环遍历所有返回的类次,通过一遍又一遍地执行此查询(使用返回的 startend 来测试另一个类次是否与它们冲突)来自上述查询结果的值):

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 名员工,因此我正在寻找一种方法来查询一次,看看是否有任何重叠(startend 与另一个 startend)记录一个 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/

相关文章:

php - ImageMagick 创建多个文件

sql - 这两个 SQL 查询有什么区别

mysql - 如何使用索引最好地连接表

MySQL如何将两个JOINed表的列求和成一个新列?

php - PHPMyadmin "tî ă jî șî pî"中的罗马尼亚语单词不正确?

博客场的数据库设计建议

具有多个事件的 C# 按钮

php - 如何反转此 mysql 表或其表示的顺序?

php - 如何在 ActionScript 3 中获取关于 MySQL 时间戳的时间?

javascript - 进度条在 XMLHTTPRequest 中不起作用