2016-11-25 116 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:00 18:00 18: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

我堅持,我不知道我怎麼能解決這個問題,所以我會在這裏得到一些幫助。

感謝

相關的數據庫表

與有關到視頻

please download the sql table

fab_booking_taken與已經存在的預訂預訂25 11 2016 ID = 347

fab_booking Please download the sql table

ID 347有關預訂

fab_booking_slots表,其中包含所有可能的時隙

Please download the sql table

fab_heuredepart_resa表,填充下拉元素

Please download the sql table

+1

該查詢非常複雜。如果您爲查詢中引用的每個表發佈了一些示例數據,那肯定會有所幫助。 – mendosi

+1

謝謝mendosi,可以下載數據庫表。 – marcq

+0

我並不完全瞭解您的業務規則,但如果預訂時間是從14:00到17:30,他們想要改變時間,爲什麼只在14:00,18:00,18:30和19:00提供: 00和19:30?爲什麼不在14:30,15:00,15:30,16:00,16:30,17:00和17:30? – mendosi

回答

0

我不得不承認試圖解開這個查詢來理解它背後的邏輯是令人生畏的,但我認爲以下查詢應返回您需要的結果。

{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, 對不起,我遲到的答覆,並感謝您花時間來幫助我。 確實,您的查詢是部分工作。不是因爲你,而是因爲我忘了我還需要檢查選擇的持續時間(通過下拉菜單)是否未超過兩次預訂之間的可用時間。 我認爲,如果我可以支付|聘請你來完成這項工作,那麼當然我會更容易,因爲我需要找到解決方案。你感興趣嗎?如果是的話,我怎麼能聯繫你以便給你規範並獲得報價? – marcq

+0

@marcq不,我不認爲我能做到這一點。除了工作之外,我沒有真正的硬件或軟件來提供任何實際幫助。我只能回答一些像這樣純粹使用SQLFiddle的SQL問題... – mendosi

+0

謝謝mendosi,我明白,我會嘗試找到另一種解決方案。乾杯 – marcq