私は、顧客が次の予定を予約するために選択できる予約時間を見つける必要があるクライアント用のオンライン予約システムを開発しています。
現在のデータベース設定について説明します。
テーブル名:予定- これらは、顧客が現在予約している予定です。
+----+---------+------------+-----------+--------- ----------------+------+-----------+ | | ID | スタッフID | 日付 | 開始時刻 | 終了時間 | 顧客名 | 部屋 | 治療 | +----+---------+------------+-----------+--------- ----------------+------+-----------+ | | 1 | 2 | 2015-08-24 | 09:00:00 | 10:00:00 | スミス氏 | 1 | 1 | | | 2 | 2 | 2015-08-24 | 11:00:00 | 12:00:00 | ジョーンズ氏 | 2 | 1 | +----+---------+------------+-----------+--------- ----------------+------+-----------+
テーブル名: staff - スタッフのリスト、彼らが働く曜日、関連する日のシフトの開始時刻と終了時刻。
+----+------+----------+-----------+----------+ | | ID | 名前 | 曜日 | 開始時刻 | 終了時間 | +----+------+----------+-----------+----------+ | | 1 | フィル | 1 | 09:00:00 | 17:00:00 | | | 2 | リサ | リサ | 5 | 09:00:00 | 18:00:00 | | | 3 | リサ | リサ | 3 | 09:00:00 | 17:00:00 | | | 4 | ボブ | 5 | 15:00:00 | 17:00:00 | +----+------+----------+-----------+----------+
テーブル名:治療- 利用可能な治療のリスト
+----+-------------+----------+ | | ID | 名前 | 期間 | +----+-------------+----------+ | | 1 | 治療 1 | 01:30:00 | | | 2 | 治療 2 | 01:00:00 | +----+-------------+----------+
テーブル名: staff Treatments - どの治療がどのスタッフによって実行されるかを識別するためのルックアップ テーブル。
+----+-------+-----------+ | | ID | スタッフ | 治療 | +----+-------+-----------+ | | 1 | 1 | 1 | | | 2 | 2 | 1 | +----+-------+-----------+
したがって、治療 1 はスタッフ メンバーのリサによって実行されると想定できますが、リサは水曜日の午前 9 時から午後 5 時までと金曜日の午前 9 時から午後 6 時までしか勤務していません。Phil は治療 1 も実行できますが、月曜日の午前 9 時から午後 5 時までしか実行できません。
私のアプリケーションでは、ユーザーが予約しようとしている治療法を尋ねています。たとえば、90分間続くトリートメント1。次に、顧客は予約を希望する日付を選択します。したがって、この段階で、必要な予約の時間の長さと日付、その後の曜日がわかります。
選択した日付を取得し、次の 5 日間、毎日ループします。
事前に予約された予定を含む予定テーブルに基づいて、顧客が選択できるすべての利用可能な時間帯を表示できるクエリを開発しようとして立ち往生しています。
顧客が 8 月 24 日にトリートメント 1 を予約したいとします。リサは金曜日の午前 9 時から午後 6 時まで勤務していることがわかっていますが、すでに午前 9 時から午後 12 時までの予定があります。
治療は 90 分なので、最終的に次のようなデータが必要です。
+----------+-------+----------------+------------- -+ | | 日付 | スタッフ | スタッフ | 利用可能開始 | 利用可能終了 | +----------+-------+----------------+------------- -+ | | 24/08/15 | リサ | リサ | 12:00 | 13:30 | | | 24/08/15 | リサ | リサ | 13:30 | 15:00 | | | 24/08/15 | リサ | リサ | 15:00 | 16:30 | | | 24/08/15 | リサ | リサ | 16:30 | 18:00 | | | 24/08/15 | ボブ | 15:00 | 16:30 | +----------+-------+----------------+------------- -+
ただし、次の問題は、利用可能な部屋が4つしかないため、同時に4つ以上のトリートメントを予約できないことです。
この投稿を見ました - Finding free blocks of time in mysql and php?
しかし、私の退職はもう少し複雑で、クエリの作成方法がわかりません。どんな助けでも大歓迎です。
構造にいくつかの変更を加えました。私のクエリは次のとおりです。
SELECT トレーナー、日、予約日、from_time、to_time、タイムスロット から ( トレーナーを選択 、ある日 、予約日 , TIMEDIFF(start_time, IF(bookingdate=@prevdate,@prevend,open_time )) タイムスロットとして , IF(bookingdate=@prevdate,@prevend,open_time ) as from_time 、to_timeとしてのstart_time , @prevend := end_time as prevend , @prevdate := prevdate としての予約日 FROM 予約の空き状況 JOIN (SELECT @prevend:=null,@prevdate:=null) を init として INNER JOIN ブッキングスケールレンダー c ON a.trainer = c.trainer AND WEEKDAY(c.bookingdate) = a.day 連合 トレーナーを選択 、 日 、予約日 、タイムスロットとして TIMEDIFF(close_time, IFNULL(MAX(end_time),open_time) ) , IFNULL(MAX(終了時間),開始時間) as from_time 、to_timeとしてのclose_time 、防止として null 、null as prevdate FROM 予約の空き状況 LEFT JOIN ブッキングスケールレンダー c ON a.trainer = c.trainer AND WEEKDAY(c.bookingdate) = a.day GROUP BY a.trainer,day,bookingdate ) ギャップとして WHERE タイムスロット > '00:00:00' ORDER BY トレーナー、日、予約日、from_time;
次のデータを使用します。
+----+-------------+---------+------------+------- ---+-------------+------+-----------+ | | ID | 予約日 | トレーナー | 開始時刻 | 終了時刻 | customer_id | 部屋 | 治療 | +----+-------------+---------+------------+------- ---+-------------+------+-----------+ | | 1 | 2015-08-24 | 2 | 15:00:00 | 16:00:00 | スミス氏 | 1 | 1 | | | 2 | 2015-08-31 | 2 | 16:00:00 | 17:00:00 | ジョーンズ氏 | 2 | 1 |
と
+-----+---------+-----+-----------+--- ------+-------------+ | | 可用性_id | トレーナー | 日| open_time | close_time | トレーナー名 | +-----+---------+-----+-----------+--- ------+-------------+ | | 4 | 1 | 2 | 09:00:00 | 17:00:00 | リサ | リサ | | | 6 | 1 | 4 | 09:00:00 | 17:00:00 | リサ | リサ | | | 7 | 1 | 5 | 09:00:00 | 17:00:00 | リサ | リサ | +-----+---------+-----+-----------+--- ------+-------------+
返されるデータは次のとおりです。
+---------+-----+-------------+-----------+------- ---+----------+ | | トレーナー | 日| 予約日 | from_time | 時間まで | タイムスロット | +---------+-----+-------------+-----------+------- ---+----------+ | | 1 | 2 | ヌル | 09:00:00 | 17:00:00 | 08:00:00 | | | 1 | 4 | ヌル | 09:00:00 | 17:00:00 | 08:00:00 | | | 1 | 5 | ヌル | 09:00:00 | 17:00:00 | 08:00:00 | +---------+-----+-------------+-----------+------- ---+----------+
ただし、予約日は表示されず、Null 値のみが表示されます。
何か案は ?