2016-11-25 5 views
3

私は予約システムを開発しています。私の予約フォームには、予約システムの利用可能な開始時間スロットを返すドロップダウン要素があります。複合検索によるドロップダウン

新しい予約を作成することによって、私が作成したクエリは正常に動作し、利用可能なすべての開始タイムスロットが正しく返されます。

QUERY:

WHERE {thistable}.id 
IN (
    SELECT id +3 
    FROM (
      SELECT p1.book_date, t.*, count(p1.book_date) AS nbre 
      FROM fab_booking_taken AS p1 
      CROSS JOIN fab_booking_slots AS t 
      WHERE NOT ((t.heuredepart_resa < p1.book_end AND 
       t.heurearrivee_resa > p1.book_start)) 
       AND DATE(p1.book_date)=DATE('{fab_booking___book_bookingdate}') 
      GROUP BY t.id) AS x 
      WHERE nbre = 
      (
      SELECT count(p2.book_date) 
      FROM fab_booking_taken AS p2 
      WHERE p2.book_date = x.book_date 
      ) 
    ) ORDER BY id ASC 

ビデオを参照してください:

:私は、既存の予約可能な開始時間スロットがファインである返され編集することにより、同じクエリを使用してい booking creationg

問題を

18:00 18:30 19:00 19:30

私の例14:00にある顧客が選択した(およびデータベースに保存された)タイムスロットではありません。

ビデオをご覧ください。Editing booking with same query

ドロップダウンは、以下のオプションを使用して移入する必要があります。

14時 午前18時00 午後6時30分 19時00 19時30

私は顧客が選択した開始タイムスロットと(まだ)利用可能な開始タイムスロットによって既に取得するためのユニオンクエリを作成しようとしました。

QUERY:

{thistable}.id 
IN ( 
    SELECT id + 3 
    FROM ( 
      SELECT p1.book_date, t.*, count(p1.book_date) AS nbre 
      FROM fab_booking_taken AS p1 
      CROSS JOIN fab_booking_slots AS t 
      WHERE NOT ((t.heuredepart_resa < p1.book_end 
      AND t.heurearrivee_resa > p1.book_start)) 
      AND p1.book_date = DATE_FORMAT('{fab_booking___book_bookingdate}', '%Y-%m-%d') 
      GROUP BY t.id 
     ) as foobar2 
    UNION ( 
      SELECT id + 3 
      FROM ( 
        SELECT p1.book_date, t.*, count(p1.book_date) AS nbre 
        FROM fab_booking_taken AS p1 
        CROSS JOIN fab_booking_slots AS t 
        WHERE ((t.heuredepart_resa < p1.book_end 
        AND t.heurearrivee_resa > p1.book_start)) 
        AND t.id = '{fab_booking___book_starttime}' 
        AND p1.book_date = DATE_FORMAT('{fab_booking___book_bookingdate}', '%Y-%m-%d') 
        GROUP BY t.id 
      ) AS x 
     WHERE nbre = ( 
        SELECT count(p2.book_date) 
        FROM fab_booking_taken AS p2 
        WHERE p2.book_date = x.book_date 
        ) 
      ) 
    ) 

既に顧客選択された開始時間帯によっては、返された(14:00)であるが、他の利用可能な返さ開始タイムスロットが正しくありませんされています。

ビデオをご覧ください。Editing booking with union query

私がこだわっていると私は、私はこの問題を解決することができ、私はここにいくつかの助けに感謝だろうか見当もつかない。

おかげ

関連するデータベーステーブルビデオ25 11 2016 ID = 347

上の既存の予約と

please download the sql table

fab_booking_takenに当該予約でfab_booking

Please download the sql table

ID 347は、私は認めざるを得ない、ドロップダウン要素

Please download the sql table

+1

このクエリはかなり複雑です。クエリで参照されている各テーブルのサンプルデータをいくつか投稿した場合は、役立つはずです。 – mendosi

+1

mendosiありがとう、データベーステーブルをダウンロードすることができます。 – marcq

+0

私はあなたのビジネスルールを完全に理解していませんが、14:00〜17:30の予約で時間を変更したい場合は、14:00,18:00,18:30,19: 00と19:30?なぜ14:30,15:00,15:30,16:00,16:30,17:00,17:30にもなりませんか? – mendosi

答えて

0

を移入可能なすべてのタイムスロット

Please download the sql table

fab_heuredepart_resaテーブルが含まれている懸念予約

fab_booking_slotsテーブルですそれはそれの背後にある論理を理解するためにそのクエリを解くことを試みるのは難しいが、私は思う次のクエリでは必要な結果が返されるはずです。

{thistable}.id IN (
    /*Finds booking slots where the booking slot does not overlap 
     with any of the existing bookings on that day, 
     or where the booking slot id is the same as the current slot.*/ 
    SELECT t.id + 3 
    FROM fab_booking_slots AS t 
    WHERE t.id = '{fab_booking___book_starttime}' 
    OR NOT EXISTS (
     Select 1 
     From fab_booking_taken AS p1 
     Where Date(p1.book_date) = Date('{fab_booking___book_bookingdate}') 
     And p1.book_end > t.heuredepart_resa 
     And p1.book_start < t.heurearrivee_resa 
    ) 
) 
Order By id Asc; 

私は、これは論理的に等価であることをかなり確信している、と一度簡略化した形で表現し、このようにそれはあなたが、それはまた、追加のタイムスロットを返すために得ることができる方法を確認する方が簡単です。

既存のタイムスロットを持たない新しい予約のタイムスロットを入力するときに使用する別のクエリが必要です。この場合、単一行t.id = '{fab_booking___book_starttime}' ORを削除するだけで済みます。

+0

こんにちはmendosi、 ご返信ありがとうございました。ありがとうございました。 実際、クエリは部分的に機能しています。あなたのためではなく、私が忘れたので、(ドロップダウンから)選択された期間が、2つの予約と利用可能な2つのスロットの間で利用可能な時間を超えていないかどうかを確認する必要もあります。 解決策を見つける必要があるので、私があなたに仕事をさせるためにあなたに賃金を支払うことができれば、私はもっと簡単だろうと思います。興味ありますか?はいの場合、どのように私はあなたに仕様を提供し、見積もりを得るために連絡することができますか? – marcq

+0

@marcqいいえ、私はそれをすることができるとは思わない。私は実際に仕事以外では実際の能力を助けるためのハードウェアやソフトウェアを持っていません。私はちょうどSQLFiddleを使用してこのようないくつかのSQLの質問に答えることができます... – mendosi

+0

mendosiありがとう、私は理解する、私は別の解決策を見つけることを試みます。乾杯 – marcq

関連する問題