编辑:我已经将标题更改为“根据最小和最大日期和持续时间查找最便宜的可用日期 - MySQL PHP”,以使问题更通用,希望其他人有了这个问题就能找到解决方案。以下是我原始问题的全部内容,但在这里我将重新编写它,因为现在我明白了问题是什么,我可以更好地解释它。我自己也加了答案。
重写问题
Artful Software网站有一个名为“Find sequence starts and ends”的查询示例,我希望将其用于查找可用房间的日期序列,但由于某种原因查询会破坏顺序结果从一个月到下一个月交叉。例如,如果一个房间在6月28日到7月3日之间可用,它将返回两个结果:
v:register
当它们应该返回那些日期的一个结果时,因为它们是连续的。为什么会发生这种情况?如何防止它?
原始详细问题
鉴于最短到达日期,最长出发日期和停留时间,我想找到该期间任何时间可用的房间并返回最便宜的日期。
例如。用户希望在5月25日至6月30日之间的任何时间逗留14晚。首先,我需要检查我的哪些房间在5月25日至6月30日期间至少连续14晚可用,然后对于每个房间,我想显示哪些日期将是最便宜的住宿14晚。
我有:
使用artfulsoftware.com上的示例(特别是this one。向下滚动到'论坛撰稿人'笔记本电脑别名“发布此解决方案”部分以查看我使用过的联接示例)我来了到目前为止。这是我试图找出哪些房间至少有正确数量的连续可用日期;它没有尝试找到最便宜的:
28th - 30th June
1st - 3rd July
现在我遇到的问题是,由于某种原因,当我们达到月末时,这会打破连续日期。比如说,从5月25日到6月14日,房间一直可用,而不是在20晚之后取回一个结果,它将带回两个:
我不知道为什么要这样做或者如何解决它,但我想如果我能解决这个问题,它将解决问题的前半部分。第二个是通过查看费率表,在返回期间找到最便宜的14晚住宿,但一次只能做一件事。
答案 0 :(得分:0)
事实证明,经过大量的搔抓,解决方案很简单。 Artful Software页面上的示例之所以有用,是因为他只处理序号而不是日期。要使用日期,您必须更改+1和-1才能添加和减去日期。这是该网站的原始解决方案:
ping -t 10 *IPADDRESS* > ~/Desktop/WiFi.txt
system_profiler SPAirPortDataType > ~/Desktop/WiFi.txt
为了使日期工作,只需使用:
SELECT
a.id AS Start,
MIN( c.id ) AS End
FROM tbl AS a
LEFT JOIN tbl AS b ON a.id = b.id + 1
LEFT JOIN tbl AS c ON a.id <= c.id
LEFT JOIN tbl AS d ON c.id = d.id - 1
WHERE b.id IS NULL
AND c.id IS NOT NULL
AND d.id IS NULL
GROUP BY a.id;