【问题标题】:Mysql Query Search By DatesMysql查询按日期搜索
【发布时间】:2017-09-03 20:11:04
【问题描述】:

我尝试创建一个查询,显示入住和退房日期之间的可用酒店。另外,当我预订特定房间时,我将他们的预订列设置为 1。这意味着,当结帐日期出现在现实生活中时,触发函数会将预订的列设置为 0。

如果酒店的所有房间都已预订(booked=1)并且这些房间的入住退房日期是特定日期(入住退房输入),则不要将该酒店放在列表中。我的查询没有显示我想要的结果。

查询:输入:国家(州)、签到和签出。

SELECT DISTINCT a.* FROM accommodation a INNER JOIN cb_states s ON a.state = s.id
INNER JOIN accommodation_rooms ar ON a.id = ar.accommodation
WHERE state = 1 AND a.id NOT IN
(
    SELECT 1 FROM booking b
    WHERE
    (
        (b.arrival_date BETWEEN '2017-11-16' AND '2018-03-16') 
        OR
        (b.departure_date BETWEEN '2017-11-16' AND '2018-03-16')
    )
)

当我运行查询时,无论日期如何,它总是显示所有酒店。如果我写... WHERE ar.booked = 0 AND state = 1 AND a.id NOT IN...,那么它不会显示住宿 id 13,但是当我更改日期时它也不会显示。

住宿表:

accommodation_rooms 表:

预订表:

booked_rooms 表:(与预订表有外键)

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您的查询存在多个问题:

    1. NOT IN 列表有SELECT 1。这并没有给NOT IN 列表带来很多变化。
    2. 您的重叠逻辑是错误的。
    3. 我认为您需要将住宿房间连接到预订的住宿房间。

    所以:

    SELECT DISTINCT a.*
    FROM accommodation a INNER JOIN
         cb_states s
         ON a.state = s.id INNER JOIN
         accommodation_rooms ar
         ON a.id = ar.accommodation
    WHERE s.state = 1 AND
          a.id NOT IN (SELECT br.accommodation_room
                       FROM booking b JOIN
                            booked_room br
                            ON b.?? = br.??
                       WHERE b.arrival_date <= '2018-03-16' AND
                             b.departure_date >= '2017-11-16' 
                      );
    

    【讨论】:

    • 最适合我情况的逻辑是什么?
    • @MalenaT 。 . .这有逻辑修复。 &lt;= 而不是 between 发现 any 重叠。
    • 我明白了。谢谢b.?? = br.?? 在这里,我写了b.id = br.booking 仍然显示错误的结果。另外,我在子查询..... JOIN booked_rooms br ON b.id = br.booking JOIN accommodation_rooms aar ON br.room = aar.id中将住宿房间连接到预订房间,它再次显示错误的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多