gpt4 book ai didi

php - MySQL 中的连续数据可用性查询?

转载 作者:可可西里 更新时间:2023-11-01 07:58:16 25 4
gpt4 key购买 nike

我的数据库中有一个表,其中包含以下数据:

————————————————————————————————————————————————————————————————————————
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也有可用的日期。那么我们应该如何通过 MySQL 查询删除 2 并仅显示 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

您可以使用您的实际数据集对其进行测试,并告诉我们它与第一个解决方案相比如何。

关于php - MySQL 中的连续数据可用性查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37564135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com