繁体   English   中英

MySQL - 预订查询 - Select 在给定日期范围内可用的所有产品

[英]MySQL - Booking Query - Select All Products That Are Available In A Given Date Span

我有 2 个 mysql 数据库表:产品和预订(忽略不重要的列)

产品

列名 列类型
product_id INT
产品名称 varchar

预订

列名 列类型
预订编号 INT
product_id INT
开始日期时间 约会时间
结束日期时间 约会时间

我正在使用以下查询来提取可用产品

SELECT
    p.product_id,
    p.product_name
FROM
    product p
WHERE
    NOT EXISTS(
        SELECT
            *
        FROM
            reservation r
            INNER JOIN product p ON p.product_id = r.product_id
        WHERE
            AND r.start_datetime >= '2021-05-07 00:00:00'
            AND r.end_datetime <= '2021-05-07 23:59:59'
    )

这最有效,但问题是如果产品预订超过 1 天,该产品就会出现。

例如,产品 A 从2021-05-07 05:00:00 to 2021-05-08 12:00:00预订。 由于此产品结束日期不在AND r.end_datetime <= '2021-05-07 23:59:59'内,因此它会显示在查询结果中。 我怎样才能避免这种情况?

我认为你想要的逻辑是:

SELECT p.product_id, p.product_name
FROM product p
WHERE NOT EXISTS (SELECT 1
                  FROM reservation r
                  WHERE p.product_id = r.product_id AND
                        r.end_datetime >= '2021-05-07' AND
                        r.start_datetime <= '2021-05-08'
                 );

这将返回所有未在 2021-05-07 期间保留的产品。

注意变化:

  • 子查询中没有JOIN 相反,它有一个相关条款。
  • 重叠逻辑是预订在一天开始之后结束,而预订在一天结束之前开始。 这是重叠的一般逻辑。
  • 不需要时间。 另外, <更准确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM