2017-12-28 4 views
-2

のために私は予約の詳細は、次のように保存されたすべてのサービスの予約リスト予約テーブル持っている:私は行に来た予約の開始日と終了日を取得したいMySQLのクエリの日付範囲

id user_id booking_date booking_id 
1 3  2017-01-10  booking1 
2 3  2017-01-11  booking1 
3 3  2017-01-12  booking1 
4 3  2017-01-13  booking1 
5 3  2017-01-14  booking1 
6 4  2017-01-19  booking2 
7 4  2017-01-20  booking2 
8 4  2017-01-21  booking2 
9 4  2017-01-22  booking2 
10 3  2017-02-14  booking3 
11 3  2017-02-15  booking3 

を。 user_idの3のためのような は、予約日の2日付範囲

from `2017-01-10 to 2017-01-14` 

、その後、いくつかのレコードの後

from `2017-02-14 to 2017-02-15` 
+0

サンプルに基づいて完全な結果を提供してください。 –

+0

特定の予約の全範囲を定義する予約IDはありませんか? – isaace

+0

ありがとうございました。ありがとうございました。私は言い逃れました。MRonlineからの回答は、私から – Sark

答えて

2

まずを持って、私はそのようなシーケンスを得ることが意味を成していないと思います。 ...しかし、大丈夫です。

これを行うには、1つのクエリがそのデータと組み合わされます。だから私はまず "group_id"や "order_id"のような列を追加します。だから一緒に属しているすべての注文に1つのIDを保存することができます。 IDを昇順に並べ替え、次の(または最後の)データが同じuser_idを持つかどうかを確認するだけです。

あなたがORDER_ID列を持っている

、あなたは簡単な

SELECT MIN(booking_date), MAX(booking_date) FROM table GROUP BY order_id 
+0

ありがとう私にとって完璧です:) – Sark

+0

@shark、このクエリにはいくつかの問題があります: 'order_id'はあなたのテーブルには存在せず、もっと重要なのは2つの範囲のuser_idを取得しないということです3 – danihp

+0

@danihpクエリだけでなくテキストを読む – MRonline

1

[OK]を、誰もが簡単であると言いません...行きましょうことができます。これはギャップと島の問題です。 postges sqlで簡単に解決できると私に言いましょう

あなたのシナリオにmysql変数を適用します。

私はSQL Fiddleにそれを解決:

のMySQL 5.6スキーマのセットアップ

create table t (user_id int, booking_date date); 
insert into t values 
( 3,  '2017-01-10'), 
( 3,  '2017-01-11'), 
( 3,  '2017-01-12'), 
( 3,  '2017-01-13'), 
( 3,  '2017-01-14'), 
( 4,  '2017-01-19'), 
( 4,  '2017-01-20'), 
( 4,  '2017-01-21'), 
( 4,  '2017-01-22'), 
( 3,  '2017-02-14'), 
( 3,  '2017-02-15'); 

クエリ1

select user_id, min(booking_date), max(booking_date) 
from (
select t1.user_id, 
     t1.booking_date, 
     @g := case when(
         DATE_ADD(@previous_date, INTERVAL 1 DAY) <> t1.booking_date or 
         @previous_user <> t1.user_id) 
        then t1.booking_date 
        else @g 
      end as g, 
     @previous_user:= t1.user_id, 
     @previous_date:= t1.booking_date 
from t t1, (select 
      @previous_user := -1, 
      @previous_date := STR_TO_DATE('01/01/2000', '%m/%d/%Y'), 
      @g:=STR_TO_DATE('01/01/2000', '%m/%d/%Y')) x 
order by user_id, booking_date 
) X 
group by user_id, g 

Results

| user_id | min(booking_date) | max(booking_date) | 
|---------|-------------------|-------------------| 
|  3 |  2017-01-10 |  2017-01-14 | 
|  3 |  2017-02-14 |  2017-02-15 | 
|  4 |  2017-01-19 |  2017-01-22 | 

説明各範囲についてネストされたクエリ図アップgroup codeg)。外部クエリは、各グループの最大値と最小値を取得します。

+0

これは複雑ですが、私はこれを行うには良い方法だと感じました、ありがとうございました:) – Sark