[英]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.