我试图使用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并过滤数字范围。
非常感谢您对此查询的一些帮助。
提前谢谢
答案 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 。