sql-查找日期范围内的可用插槽

njthzxwz  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(335)

我有以下数据库架构:

CREATE TABLE `property` (
    `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(100) NOT NULL
);
CREATE TABLE `venue` (
    `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `property_id` INT(11) NOT NULL,
    `name` VARCHAR(100) NOT NULL
);
CREATE TABLE `venue_available` (
    `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `venue_id` INT(100) NOT NULL,
    `day` VARCHAR(10) NOT NULL,
    `from_time` TIME NOT NULL,
    `to_time` TIME NOT NULL,
    `lead_time_in_minutes` INT(11)
);
CREATE TABLE `venue_unavailable` (
    `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `venue_id` INT(100) NOT NULL,
    `from_datetime` DATETIME NOT NULL,
    `to_datetime` DATETIME NOT NULL
);
CREATE TABLE `venue_reservation` (
    `id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `venue_id` INT(100) NOT NULL,
    `start_datetime` DATETIME NOT NULL,
    `end_datetime` DATETIME NOT NULL
);

我想找一些有场地的酒店,从8月25日(星期六)到8月27日(星期一)上午10点到下午3点
下面是我尝试的sql查询

SELECT
    p.id,
    p.name AS property_name,
    v.name AS venue_name
FROM
    venue v
LEFT JOIN
    property p ON v.property_id = p.id
-- venue_available
LEFT JOIN
    venue_available va_0 ON va_0.venue_id = v.id
LEFT JOIN
    venue_available va_1 ON va_1.venue_id = v.id
WHERE 1 = 1
-- venue_available
    AND (
        (va_0.day = 'sat' AND va_0.from_time <= '2018-08-25 10:00:00' AND va_0.to_time >= '2018-08-25 15:00:00') AND
        (va_1.day = 'sun' AND va_1.from_time <= '2018-08-26 10:00:00' AND va_1.to_time >= '2018-08-26 15:00:00')
    )
-- venue_unavailable
    AND NOT EXISTS (SELECT * FROM venue_unavailable vu WHERE '2018-08-25 10:00:00' <= vu.to_datetime AND '2018-08-26 15:00:00' >= vu.from_datetime)
GROUP BY
    p.id;

当前查询的问题是 venue_available 在sql中,查询似乎工作正常,但当我为 venue_unavailable 它返回空的结果,但是基于我期望的1个结果的数据。
如果您想使用schema和fixture,下面是到sqlfiddle的链接
http://sqlfiddle.com/#!2010年9月30日
这就是我要做的
1获取所有属性(不是场馆)的列表2。仅当与您核对后有一个或多个场地可用时,才列出酒店
提供场地
场地不可用
场馆预订
你能帮我解决这个问题吗
谢谢您。
更新1
我按照下面的帖子来确定场馆中的重叠日期,并选择不在日期之间的行(预订)

ee7vknir

ee7vknir1#

好的,我解决这个问题的方法是使用子查询,现在正在运行。
我现在使用where子句

WHERE v.id NOT IN (SELECT venue_id FROM provider_block pb WHERE :start_datetime <= pb.to_date AND :end_datetime >= pb.from_date)

目前看来这项工作还可以。

相关问题