【问题标题】:MySQL - Booking Query - Select All Products That Are Available In A Given Date SpanMySQL - 预订查询 - 选择在给定日期范围内可用的所有产品
【发布时间】:2021-05-05 16:11:45
【问题描述】:

我有 2 个 mysql 数据库表:Product & Reservation(忽略不重要的列)

产品

Column Name Column Type
product_id INT
product_name varchar

预订

Column Name Column Type
reservation_id INT
product_id INT
start_datetime datetime
end_datetime datetime

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

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 &lt;= '2021-05-07 23:59:59' 范围内,因此它会显示在查询结果中。我怎样才能避免这种情况?

【问题讨论】:

  • 只标记你真正使用的数据库,好像是MySQL。

标签: mysql sql


【解决方案1】:

我认为你想要的逻辑是:

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。相反,它有一个关联子句。
  • 重叠逻辑是当天开始后预约结束,当天结束前开始预约。这是重叠的一般逻辑。
  • 不需要时间。另外,&lt; 更准确。

【讨论】:

  • 这是完美的工作。我真的很感谢戈登!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 2020-11-05
  • 2014-06-14
  • 1970-01-01
相关资源
最近更新 更多