这实际上是两个人,但是现在可以随意回答第1部分。
Property
==============
ID | ... |
Calendar
=============
property_id | start_date | end_date | block_reason
property
表包含有关该属性的所有数据。 calendar
表包含因任何原因而被阻止的日期范围。 start_date
和end_date
之间(包括)的日期被视为已被屏蔽。 property
与calendar
表格有一对多的关系。
我想选择一个在给定开始日期和结束日期之间有可用日期的属性。到目前为止,我已经尝试过了。
SELECT *
FROM property AS p
LEFT JOIN calendar AS c ON c.property_id=p.id
WHERE (c.start_date IS NULL OR c.start_date > "{my start date}")
AND (c.end_date IS NULL OR c.end_date < "{my end date}")
如果属性在日历表中没有结果,则此方法有效。但是否则非常失败(空结果集)。
一旦我们得到第1部分工作。用户还可以提供可用的天数,我们需要选择在给定的起始范围内具有连续天数的属性。基本上“我想要一个在X和Y日期之间有N天的房产。”
我整个上午一直在谷歌搜索,我的朋友/同事似乎都没有想法从哪里开始。因为结果是分页的,所以我想避免在PHP中处理这个并且不得不做整个选择,过滤,重复直到没有结果或整页,逻辑shindig。
我很感激帮助。感谢。
根据请求,虚拟数据的小提琴。 http://sqlfiddle.com/#!9/854eb/7
答案 0 :(得分:2)
这个想法是计算两者之间的天数,然后将其与天数进行比较。假设没有重叠,结束日期是包容性的:
SELECT c.property_id
FROM calendar c
WHERE c.start_date <= {my end date} AND
c.end_date >= {my start date}
GROUP BY c.property_id
HAVING SUM(datediff(greatest({my start date}, c.start_date),
least({my end date}, c.end_date)
) + 1
) < datediff({my end date} , {my start date}) + 1