mysql - 预订系统

标签 mysql sql database phpmyadmin

这是数据库模式:

   CREATE TABLE `bookings` (
      `id` int(2) NOT NULL,
      `start` time NOT NULL,
      `end` time NOT NULL
    )

    INSERT INTO `bookings` VALUES(1, '13:00:00', '14:30:00');
    INSERT INTO `bookings` VALUES(2, '15:00:00', '16:00:00');

我尝试运行以下查询来查找空闲时间:

SELECT free_from, free_until
FROM (SELECT a.end AS free_from,
             (SELECT MIN(c.start)
              FROM bookings c
              WHERE c.start>a.end
             ) as free_until
      FROM bookings a
      WHERE NOT EXISTS (SELECT 1
                        FROM bookings b
                        WHERE b.start BETWEEN a.end AND a.end + INTERVAL your_duration HOURS
                       ) AND
            a.end BETWEEN '10:00:00' AND '18:00:00'
     ) t

生成的输出是:

free_from   free_until
14:30:00    15:00:00
16:00:00    NULL

为什么最后会有一个NULL呢?请帮我解决这个问题。预期输出应该是:

free_from   free_until
10:00:00    13:00:00
14:30:00    15:00:00
16:00:00    18:00:00

最佳答案

试试这个:

先建表并插入记录

CREATE TABLE bookings (
      id int NOT NULL,
      start time NOT NULL,
      endtime time NOT NULL
    )

    INSERT INTO bookings VALUES(1, '13:00:00', '14:30:00');
    INSERT INTO bookings VALUES(2, '15:00:00', '16:00:00');

然后运行这个选择查询

SELECT free_from, free_until
FROM (SELECT a.endtime AS free_from,
(SELECT MIN(c.start)
              FROM bookings c
              WHERE c.start>a.endtime
             ) as free_until
            FROM bookings a
      WHERE a.endtime BETWEEN '10:00:00' AND '18:00:00'
       ) t where free_until IS NOT NULL;

注意:我将您的列 end 更改为 endtime

关于mysql - 预订系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23335164/

相关文章:

MySql解析,在不知道分割数的情况下分割成几行

mysql - 在 MySQL 中使用 Join 创建显示销售、返回和利润(销售 - 返回)的 View

具有多个Where子句的SQL计数函数

javascript - 如何将 bootstrap 年历与 mysql 库连接

c# - 使用 SELECT - C# 获取所有行和列数据

java - 从sqlite android中的表中获取单行

Android 类崩溃,不知道为什么

php - 如何在 HTML 水平表中显示 mysql 查询输出

php - 从两个表中选择所有匹配的最小值、最大值

php - WordPress 列表作者按名字或名字搜索