2

私は、顧客が次の予定を予約するために選択できる予約時間を見つける必要があるクライアント用のオンライン予約システムを開発しています。

現在のデータベース設定について説明します。

テーブル名:予定- これらは、顧客が現在予約している予定です。

+----+---------+------------+-----------+--------- ----------------+------+-----------+
| | 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 値のみが表示されます。

何か案は ?

4

1 に答える 1

-1

技術的な解決策は提供していませんが、サブクエリで問題を分割することを検討してください。サブクエリの結果を「フラグ」変数に保存し、トランザクションで行うようにチェックします。また、予約の競合を避けるために、予約確認ステージ (管理ページ) を用意することも検討してください。

お役に立てれば

于 2015-05-29T16:05:11.580 に答える