在日期范围和数字上加入2个带过滤器的表格

时间:2016-10-12 22:29:23

标签: mysql sql database join subquery

我试图使用2个表的JOIN结果来获取属性表的结果(整行)。 A" 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? What is the difference between "INNER JOIN" and "OUTER JOIN"?

但遗憾的是,我无法格式化查询并了解如何添加其他JOIN并过滤数字范围。

非常感谢您对此查询的一些帮助。

提前谢谢

2 个答案:

答案 0 :(得分:1)

要查找在另一个表中不匹配的行,您可以使用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

答案 1 :(得分:0)

您需要选择具有足够容量的属性,并且是(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