2017-03-13 8 views
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)

ここで私の問題は、私たちは多くのアパートを得ており、このクエリには極端な読み込み時間があります。

もっと良い解決策をお探しですか?

+1

あなたは 'DESCRIBE {Table_name}'と 'EXPLAIN {Your_Long_SQL_QUERY}'と '{Table_name} 'からのSHOW INDEXを出して結果を投稿できますか? – Dimi

+0

メインクエリがこの構文で閉じられていないため、いくつの 'OR EXISTS'パーツが来ますか(28?)? '01 - 08'と' 02 - 09'の後にはもっとそれがありますか? '2017-06-01 - 2017-06-30'の – JustOnUnderMillions

+0

の結果は、明示的に@Dimiを投稿することができます。@Dimi – Mario

答えて

0

が30%速くなる(COUNT(*)とフィルタステータス= "予約" の場合)= 0

クエリでそれを修正しました。

関連する問題