我有 2 张 table -> 公寓和空房情况。
表公寓中包含有关公寓的所有信息。空房表中包含有关 future 365 天内公寓可用性的所有信息。
餐 table 公寓:
id, name
示例:
1, Apartment 1
2, Apartment 2
table 可用性:
id, apartment_id, date, status
示例:
1, 1, 2017-06-01, free
2, 1, 2017-06-02, booked
3, 1, 2017-06-03, free
4, 1, 2017-06-04, free
5, 1, 2017-06-05, free
...
6, 2, 2017-06-05, free
7, 2, 2017-06-05, free
8, 2, 2017-06-05, free
9, 2, 2017-06-05, booked
10, 2, 2017-06-05, free
...
现在我想在多个日期范围内搜索一周的免费公寓,例如:
SELECT apartments where id in (
SELECT apartment_id
FROM availabilities
WHERE EXISTS (
SELECT apartment_id
FROM availabilities as a
WHERE availabilities.apartment_id = a.apartment_id
AND date >= "2017-06-01"
AND date < "2017-06-08"
AND status = "free"
GROUP BY apartment_id
HAVING COUNT(apartment_id) = DATEDIFF("2017-06-08", "2017-06-01"))
OR EXISTS (
SELECT apartment_id
FROM availabilities as a
WHERE availabilities.apartment_id = a.apartment_id
AND date >= "2017-06-02"
AND date < "2017-06-09"
AND status = "free"
GROUP BY apartment_id HAVING COUNT(apartment_id) = DATEDIFF("2017-06-09", "2017-06-02"))`
这应该查找日期范围内一周的所有可能性(2017-06-01 - 2017-06-30)
我的问题是,我们有很多公寓,而这个查询的加载时间非常长。
有更好的解决方案吗?
最佳答案
使用 (COUNT(*) 和状态过滤器=“已预订”) = 0 修复了该问题
查询速度提高了 30%。
关于php - MySQL - 需要更好的查询解决方案,极端加载时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42768283/