OK、これは MySQL ではきれいではありません。これは、サブクエリで rownum 値を偽造する必要があるためです。
基本的なアプローチは、予約テーブルの適切なサブセットをそれ自体に 1 つオフセットして結合することです。
アイテム 42 の予約の基本的なリストを、予約時間順に並べたものを次に示します。予約時間順であるとは限らないため、booking_id で注文することはできません。(2 つの既存の予約の間に新しい予約を挿入しようとしているのですね?) http://sqlfiddle.com/#!2/62383/9/0
SELECT @aserial := @aserial+1 AS rownum,
booking.*
FROM booking,
(SELECT @aserial:= 0) AS q
WHERE item = 42
ORDER BY startdate, enddate
これは、それ自体に結合されたサブセットです。秘訣は ですa.rownum+1 = b.rownum
。これは、各行を予約テーブル サブセット内の直後の行に結合します。 http://sqlfiddle.com/#!2/62383/8/0
SELECT a.booking_id, a.startdate asta, a.enddate aend,
b.startdate bsta, b.enddate bend
FROM (
SELECT @aserial := @aserial+1 AS rownum,
booking.*
FROM booking,
(SELECT @aserial:= 0) AS q
WHERE item = 42
ORDER BY startdate, enddate
) AS a
JOIN (
SELECT @bserial := @bserial+1 AS rownum,
booking.*
FROM booking,
(SELECT @bserial:= 0) AS q
WHERE item = 42
ORDER BY startdate, enddate
) AS b ON a.rownum+1 = b.rownum
これもまた、各予約 (最後の予約を除く) とそれに続く時間数を示しています。 http://sqlfiddle.com/#!2/62383/15/0
SELECT a.booking_id, a.startdate, a.enddate,
TIMESTAMPDIFF(HOUR, a.enddate, b.startdate) gaphours
FROM (
SELECT @aserial := @aserial+1 AS rownum,
booking.*
FROM booking,
(SELECT @aserial:= 0) AS q
WHERE item = 42
ORDER BY startdate, enddate
) AS a
JOIN (
SELECT @bserial := @bserial+1 AS rownum,
booking.*
FROM booking,
(SELECT @bserial:= 0) AS q
WHERE item = 42
ORDER BY startdate, enddate
) AS b ON a.rownum+1 = b.rownum
したがって、最も早い 12 時間スロットの開始時刻と終了時刻を探している場合は、その結果セットを使用してこれを行うことができます: http://sqlfiddle.com/#!2/62383/18/0
SELECT MIN(enddate) startdate, MIN(enddate) + INTERVAL 12 HOUR as enddate
FROM (
SELECT a.booking_id, a.startdate, a.enddate,
TIMESTAMPDIFF(HOUR, a.enddate, b.startdate) gaphours
FROM (
SELECT @aserial := @aserial+1 AS rownum,
booking.*
FROM booking,
(SELECT @aserial:= 0) AS q
WHERE item = 42
ORDER BY startdate, enddate
) AS a
JOIN (
SELECT @bserial := @bserial+1 AS rownum,
booking.*
FROM booking,
(SELECT @bserial:= 0) AS q
WHERE item = 42
ORDER BY startdate, enddate
) AS b ON a.rownum+1 = b.rownum
) AS gaps
WHERE gaphours >= 12