2

使用可能な日付ブロック (私の場合は 7 日間) のテーブルがあります。これは連続している場合と連続していない場合があります。

start_date    end_date    booked    id    room_id

2012-07-14    2012-07-21    0       1        6
2012-07-21    2012-07-28    0       2        6
2012-07-28    2012-08-04    1       3        6
2012-08-04    2012-08-11    0       4        6

私がやりたいことは、日付範囲内で、連続する予約されていない日付の X 週間ごとに 1 つの行を与える結果セットを取得できるようにすることです。

したがって、7 月 14 日から始まる 2 週間のブロックについて、上記の表のデータを使用すると、次のことが予想されます。

start_date    end_date    booked
2012-07-14    2012-07-28    0

コンポーネント週の 1 つが予約されているため、2 週の 2 番目のブロックは返されません。

ここに私がすでに試したいくつかのアイデアがあります:

SELECT 
    MIN(start_date) AS start_date_min,
    MAX(end_date) AS end_date_max,
    CAST(GROUP_CONCAT(id) AS CHAR) AS ids,
    SUM(booked) AS booked
FROM 
    available_dates
WHERE
    (start_date>=20120714 AND end_date<=DATE_ADD(20120714, INTERVAL 14 DAY))
GROUP BY
    room_id
HAVING
    end_date_max=DATE_ADD(20120714, INTERVAL 14 DAY)

これにより、途中までは進みますが、連続した結果は得られません。これが重要な部分です。また、テスト データを拡張すると、(おそらく HAVING 句のため) 1 つの結果しか返されません。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

1

カレンダーまたは numbersテーブルがある場合:

CREATE TABLE num
( i INT NOT NULL
, PRIMARY KEY (i)
) ;

INSERT INTO num 
  (i) 
VALUES
  (0), (1), (2), ..., (1000) ;

次のようなものを使用できます。

SELECT 
    avail.room_id,
    MIN(avail.start_date) AS start_date_min,
    MAX(avail.end_date) AS end_date_max,
    CAST(GROUP_CONCAT(avail.id) AS CHAR) AS ids,
    SUM(avail.booked) AS booked
FROM 
    available_dates AS avail
  CROSS JOIN
    ( SELECT DATE('2012-07-14') AS start_date_check
           , 52                 AS max_week_check
    ) AS param
  JOIN
    num
      ON  avail.start_date = param.start_date_check + INTERVAL num.i WEEK
      AND num.i < param.max_week_check
WHERE
    avail.booked = 0
GROUP BY
    avail.room_id,
    ( num.i / 2 )        
HAVING
    COUNT(*) = 2

あなたはこれを持つこともできます:

WHERE
    1 =1                         --- no WHERE condition
GROUP BY
    avail.room_id,
    ( num.i / 2 )        
HAVING                           --- and optionally
    SUM(avail.booked) = 0        --- this
于 2012-07-10T15:07:53.090 に答える