在MySQL中查找序列的开始和结束日期
所以我基本上有一张桌子,每个房间每天有一个入口。我需要找到在该房间、酒店和便笺上分组的所有连续日期的开始和结束日期在MySQL中查找序列的开始和结束日期,mysql,date,Mysql,Date,所以我基本上有一张桌子,每个房间每天有一个入口。我需要找到在该房间、酒店和便笺上分组的所有连续日期的开始和结束日期 property room date notes ---------------------------------------------- 2 101 2013-01-01 abc 2 101 2013-01-02 abc 2 101 2013-01-03 abc
property room date notes
----------------------------------------------
2 101 2013-01-01 abc
2 101 2013-01-02 abc
2 101 2013-01-03 abc
2 101 2013-01-04 abc
2 101 2013-01-05 xyz
2 101 2013-01-06 xyz
2 101 2013-01-15 abc
2 101 2013-01-16 abc
2 101 2013-01-17 abc
2 107 2013-01-02 def
2 107 2013-01-03 def
2 109 2013-01-01 abc
2 109 2013-01-02 abc
3 101 2012-12-31 abc
3 101 2013-01-01 abc
3 101 2013-01-02 abc
我需要能够查询它的基础上的财产和日期差不多。当我按日期搜索时,我应该能够使用序列开始日期之后的日期,并且仍然可以找到正确的开始日期。因此,如果我搜索say WHERE date='2013-01-02',我应该返回如下内容:
property room start_date end_date notes
----------------------------------------------------
2 101 2013-01-01 2013-01-04 abc
2 107 2013-01-02 2013-01-03 def
2 109 2013-01-01 2013-01-02 abc
3 101 2012-12-31 2013-01-02 abc
这将用于一个相当大的表,并返回数十万个结果,因此效率是一个主要问题。我发现并尝试应用了一些有问题的例子。大多数都太慢了,或者如果开始日期早于WHERE date条款,就不会返回正确的开始日期,等等
这里的任何帮助都将不胜感激
谢谢 您想要的数据结构可以使用group by获得: 要使用having子句获取特定日期的行,请执行以下操作:
我不确定是否还有其他更有效的方法,尽管这确实需要在整个表上进行聚合。分析大型数据集并不是MySQL的强项,因此我怀疑您很难获得良好的性能。这个查询似乎可以解决手头的问题,但不一定是最快的 选择r.property、r.room、, MAXIFrr.date=r.date,并且是结束日期,rr.date,NULL结束日期, r、 注释 从r房间 加入选择r*,如果ry.room为空,1,0为\u开始, 如果rt.room为空,则1,0为结束 从SELECT*,DATE_SUBdate,间隔1天, DATE_ADDdate,从r房间到明天间隔1天 左会合室 在r.property=ry.property和r.room=ry.room和r.notes=ry.notes上 r.date=Y.date 左联合室 在r.property=rt.property和r.room=rt.room和r.notes=rt.notes上 r.明天=rt.date 其中ry.room为NULL或rt.room为NULL rr 在r.property=rr.property和r.room=rr.room和r.notes=rr.notes上 其中r.date='2013-01-02' 按r.属性、r.房间、r.注释分组
。请注意Fiddle中的索引,它们可以加快速度。考虑提供适当的DDL和/或sqlfiddle以及所需的结果集对大型临时数据集的分析并不是MySQL的主要优势,我怀疑您不会轻易获得所需的性能。表中没有其他东西可以帮助您,比如唯一的预订id?嗯,我怀疑数据集并不能真正代表当前的问题。
select property, room, min(date) as start_date, max(date) as end_date, notes
from table t
group by property, room, notes;
select property, room, min(date) as start_date, max(date) as end_date, notes
from table t
group by property, room, notes
having date( '2013-01-02') between min(date) and max(date);