0

SQL、より具体的にはMySQLでかなり複雑なものを作成しようとして少し立ち往生しています。

データベースはレンタカーを扱っており、スノーフレーク パターンのメイン テーブルは次のようになります。

  id   | rent_start | rent_duration | rent_end     |  customerID |    carId
  -----------------------------------------------------------------------------------
  203  | 2016-10-03 |       5       |  2016-11-07  |    16545    |    4543
  125  | 2016-10-20 |       9       |  2016-10-28  |    54452    |    5465  
  405  | 2016-11-01 |       2       |  2016-01-02  |    43565    |    346

私の目標は、指定されたクエリを作成することです

1) 期間の範囲 (例: 2016 年 10 月 3 日から 2016 年 11 月 3 日まで) 2) 日数 (例: 10)

10 月 10 日から 11 日までの間に少なくとも 10 日間連続して実際に利用可能な車を取得できます。それらの車の ID のリストで十分です...そのようなクエリをセットアップする方法が本当にわかりません。

それが役立つ場合: 別のテーブルにすべての車の ID のリストがあります。

いずれにせよ、ありがとう!

4

1 に答える 1

0

この目的のためには、レンタルよりも空き状況を利用する方がはるかに簡単だと思います。

そう:

select r.car_id, r.rent_end as avail_start,
       (select min(r2.rent_start
        from rentals r2
        where r2.car_id = r.car_id and r2.rent_start > r.rent_start
       ) as avail_end
from rentals r;

次に、クエリには少なくとも 10 日間必要です。havingその目的のために句またはサブクエリを使用できます。

select r.*
from (select r.car_id, r.rent_end as avail_start,
             (select min(r2.rent_start
              from rentals r2
              where r2.car_id = r.car_id and r2.rent_start > r.rent_start
             ) as avail_end
      from rentals r
     ) r
where datediff(avail_end, avail_start) >= $days;

最後に、その期間は指定した日付の間である必要があります。

select r.*
from (select r.car_id, r.rent_end as avail_start,
             (select min(r2.rent_start
              from rentals r2
              where r2.car_id = r.car_id and r2.rent_start > r.rent_start
             ) as avail_end
      from rentals r
     ) r
where datediff(avail_end, avail_start) >= $days and
      ( (avail_end > $end and avail_start < $start) or
        (avail_start <= $start and avail_end >= $start + interval 10 day) or
        (avail_start > $start and avail_start + interval 10 day <= $end)
      );

これは、無料期間が範囲全体をカバーするか、範囲中に開始/終了するさまざまな条件を処理します。

このロジックには、間違いなく 1 つずれたエラーがあります (車は返却日に入手可能かどうか)。これにより、問題を解決するための確実なアプローチが得られるはずです。

ちなみに、一度も借りたことのない車も含める必要があります。しかし、質問で説明したテーブルではそれは不可能です。

于 2016-10-16T17:58:15.517 に答える