php - 我怎样才能简化这个关于预订的查询?

标签 php mysql

我有酒店预订系统,当用户输入一个新的预订日期和期间我需要检索所有未预订的房间,

reservations 表包含 room_id, startdate, period

我写了这个查询,只是需要简化它

select * 
from rooms 
where id in (
   select room_id 
   from reservations 
   where '2018-6-11' not BETWEEN date_at and date_add(date_at, INTERVAL period day) 
   and '2018-6-30' not between date_at and date_add(date_at, INTERVAL period day) 
   and date_at not between '2018-6-11' and '2018-6-30' 
   and date_add(date_at ,INTERVAL period day ) not between '2018-6-11' and '2018-6-30' ) 
or id not in (select room_id from reservations)

最佳答案

如何将 IN 子句转换为等效连接?请参阅以下查询是否适用于您的情况:

SELECT *
FROM rooms rm
JOIN 
   (SELECT room_id rmid
  FROM reservations
  WHERE '2018-6-11' NOT BETWEEN date_at AND date_add(date_at, INTERVAL period DAY)
  AND '2018-6-30' NOT BETWEEN date_at AND date_add(date_at, INTERVAL period DAY)
  AND date_at NOT BETWEEN '2018-6-11' AND '2018-6-30'
  AND date_add(date_at ,INTERVAL period DAY ) NOT BETWEEN '2018-6-11' AND '2018-6-30'
  ) tb1  
ON  rm.ID = tb.rmid 
JOIN reservations rv
ON rm.ID <> rv.room_id;

关于php - 我怎样才能简化这个关于预订的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50811305/

相关文章:

c# - 登录并检查账户类型

php - sanitizer 输入但输出不符合预期

MySQL在临时表中创建任意日期或数字列表?

php - 如何检索 MySQL 服务器时区,然后在 php 中进行转换

php - 简单的 php PDO 目录名称无效 : 1046 No database selected

php - URL - 获取 PHP 的最后一部分

php - 以另一个用户身份运行 shell 命令或更改 Apache 的用户?

MySQL - WHERE 语句仅适用于 SELECT 语句的一部分

MySQL数据库设计题

php - 自定义错误模板引发 fatal error