我的数据库中有一个表,其中包含以下数据:
————————————————————————————————————————————————————————————————————————
Id startDate availabilityStatus Hotel_Id
————————————————————————————————————————————————————————————————————————
1 2016-07-01 available 2
2 2016-07-02 available 2
3 2016-07-03 unavailable 2
4 2016-07-04 available 3
5 2016-07-05 available 3
6 2016-07-06 available 3
7 2016-07-07 unavailable 4
8 2016-07-08 available 4
9 2016-07-09 available 4
10 2016-07-10 available 4
现在,用户希望看到所有在2016年7月连续3天可用的酒店.
我可以进行查询以获取可用性,但不确定如何获取连续日期可用性.
根据上述数据,7月份只有Hotel Id 3,4有连续可用的日期,但是2也有日期.那么我们应该如何删除2并通过MySQL查询显示3,4.
请指教?
解决方法:
您可以使用以下查询:
SELECT DISTINCT t1.hotel_id
FROM mytable AS t1
JOIN mytable AS t2
ON t1.hotel_id = t2.hotel_id AND
DATEDIFF(t1.startDate, t2.startDate) = 2 AND
t1.availabilityStatus = 'available' AND
t2.availabilityStatus = 'available'
LEFT JOIN mytable AS t3
ON t1.hotel_id = t3.hotel_id AND
t3.startDate < t2.startDate AND t3.startDate > t1.startDate AND
t3.availabilityStatus = 'unavailable'
WHERE t3.hotel_id IS NULL
查询以这种方式编写,因此可以轻松调整以适应更长的可用期.
编辑:
这是使用变量的解决方案:
SELECT DISTINCT hotel_id
FROM (
SELECT hotel_id,
@seq := IF(@hid = hotel_id,
IF(availabilityStatus = 'available', @seq + 1, 0),
IF(@hid := hotel_id,
IF(availabilityStatus = 'available', 1, 0),
IF(availabilityStatus = 'available', 1, 0))) AS seq
FROM mytable
CROSS JOIN (SELECT @seq := 0, @hid := 0) AS vars
ORDER BY hotel_id, startDate) AS t
WHERE t.seq >= 3
您可以使用实际数据集对其进行测试,并告诉我们它与第一个解决方案的对比情况.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。