php - 从 select 语句中查找重叠时间

标签 php mysql

好的,所以我在数据库(日历)中有一个表(时间表),如果格式如下:

+----+--------+-----------+-----------+---------+
| id |  name  |    day    | startTime | endTime |
+----+--------+-----------+-----------+---------+
|  1 | George | Sunday    | 12:00     | 14:00   |
| 2  | Dan    | Monday    | 13:30     | 15:30   |
|  3 | Jeff   | Wednesday | 12:00     | 14:00   |
|  4 | Bill   | Monday    | 13:45     | 15:45   |
+----+--------+-----------+-----------+---------+

然后我有一些 PHP 如下:

  <?php
 $sql = "SELECT * FROM timetable WHERE id IN (1, 2, 3, 4)"
    $result = $con->query($sql);
     while ($row = mysqli_fetch_assoc($result)) {
         $array2[] = $row;
    }    

  echo json_encode($array2, JSON_PRETTY_PRINT);

  ?>

然后将整个表输出为 JSON 格式的关联数组。

我希望它只输出冲突的两个。由于输入法的原因,数据库中永远不会有超过两个冲突,所以它只需要检查是否有一个冲突,并输出两行的 JSON。

我不确定从哪里开始。是通过 PHP 以编程方式完成它更好,还是有办法使用 mysql 来完成?我在想它是否以编程方式完成,也许两个嵌套的 for 循环和 if 语句大于或小于时间字段?但是看起来很乱,而且我认为可能有一个我想不到的更聪明的最终优雅解决方案。

感谢您提供的任何帮助。

最佳答案

您可以在 SQL 中使用 JOIN 来实现,如下所示:-

要找到“任何重叠”,您需要将时间范围的两端相互比较。

SELECT * FROM timetable a
JOIN timetable b 
    on a.starttime <= b.endtime
    and a.endtime >= b.starttime
    and a.name != b.name;

关于php - 从 select 语句中查找重叠时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56435716/

相关文章:

php - 如何无误地删除所有 Woocommerce 结账账单字段

php - Symfony - 多对多关系刷新时的内存问题

php - 如何知道代码是否需要 eval()

MySQL Function() 不起作用

php - 在 PHP 应用程序中支持多语言的最佳和最快方法是什么

php - 使用 $http.get 从 sql 数据库检索数据

php - 错误1054 mysql语法错误未知列

php - 如何设置 php 与 html 表特定

php - 在MySQL上模拟多维数组

php - 如何使表单中的选定值保持选中状态?