繁体   English   中英

将2个表与日期范围和数字进行过滤

[英]Join 2 tables with filter on date range and number

我正在尝试使用2个表的JOIN的结果来获取属性表的结果(整个行)。 “ booking_tbl”和“ property_tbl”。 第一个条件是在指定的日期期限(startDate,endDate)内尚未预订该属性。 第二个条件是一个数字(property_tbl.max_guest)必须等于或大于另一个指定的数字(变量:num_guest)才能容纳所有客人。

到目前为止,我设法实现的目标是:

SELECT * FROM property_tbl 
INNER JOIN booking_tbl ON booking_tbl.propertyId = property_tbl.id 
WHERE NOT booking_tbl.endDate > '17-10-24' AND booking_tbl.startDate < '17-10-31';

上面的代码仅返回booking_tbl中出现的所有可用属性,property_tbl中先前未预订的列表被省略。

经过对此进行一些研究之后,我认为我应该使用LEFT JOIN? “ INNER JOIN”和“ OUTER JOIN”有什么区别?

但是不幸的是,我在格式化查询格式和理解如何添加另一个JOIN以及过滤数字范围方面遇到困难。

此查询的一些帮助将不胜感激。

先感谢您

要查找另一个表中不匹配的行,可以使用LEFT JOIN/NULL模式。 当您使用LEFT JOIN ,子表上的条件将放入ON子句中。 父表上的条件放在WHERE子句中。

SELECT p.*
FROM property_tbl AS p
LEFT JOIN booking_tbl AS b
ON p.id = b.propertyID AND booking_tbl.endDate > '17-10-24' AND booking_tbl.startDate < '17-10-31'
WHERE b.propertyID IS NULL
AND p.max_guest > @num_guest

您需要选择具有足够容量并且(A)未预订或(B)已预订但在您要查询的范围之外的属性,以下查询应可用:

select id from property_tbl p
where 
p.capacity > 5 and
not exists (
  select id from booking_tbl where p_id = p.id)

union

select id from property_tbl p
where 
p.capacity > 5 and
p.id not in (
  select distinct id from booking_tbl
  where 
        startDate between '2016-09-17' and '2016-09-22'
    OR 
        endDate between '2016-09-17' and '2016-09-22'
)

这是SQL Fiddle

暂无
暂无

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

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