0
私は2つのテーブル - >アパートと空き状況があります。MySQL - クエリ、極端なロード時間のためのより良い解決策が必要
テーブルアパートにはアパートに関するすべての情報があります。テーブルの空き状況には、次の365日間のアパートの空室状況に関するすべての情報があります。
表アパート:
id, name
例:
1, Apartment 1
2, Apartment 2
表可用性:
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)
ここで私の問題は、私たちは多くのアパートを得ており、このクエリには極端な読み込み時間があります。
もっと良い解決策をお探しですか?
あなたは 'DESCRIBE {Table_name}'と 'EXPLAIN {Your_Long_SQL_QUERY}'と '{Table_name} 'からのSHOW INDEXを出して結果を投稿できますか? – Dimi
メインクエリがこの構文で閉じられていないため、いくつの 'OR EXISTS'パーツが来ますか(28?)? '01 - 08'と' 02 - 09'の後にはもっとそれがありますか? '2017-06-01 - 2017-06-30'の – JustOnUnderMillions
の結果は、明示的に@Dimiを投稿することができます。@Dimi – Mario