2016-12-04 62 views
1

我有一個關於下面的查詢問題不工作:SQL OR NOT EXISTS不起作用

{thistable}.id IN (
SELECT id 
FROM fab_booking_slots AS slots 
WHERE id = '{fab_booking___book_starttime_raw}' 
OR NOT EXISTS (
SELECT id +1 FROM (
    SELECT taken.book_date, slots.*, count(taken.book_date) AS nbre 
    FROM fab_booking_taken AS taken 
    CROSS JOIN fab_booking_slots AS slots 
    WHERE NOT ((slots.heuredepart_resa < taken.book_end 
       AND slots.heurearrivee_resa > taken.book_start)) 
    AND DATE(taken.book_date) = DATE('{fab_booking___book_bookingdate}') 
    GROUP BY slots.id) AS x 
WHERE nbre = (
    SELECT count(taken.book_date) 
    FROM fab_booking_taken AS taken 
    WHERE taken.book_date = x.book_date) 
    ) 
) 
Order BY id ASC 

此查詢應該從下拉菜單中已經存在到數據庫返回的值,如果它們是可用插槽,可用插槽。

當我獨立運行2 SELECT時,它們正在工作。

希望在這裏有一些專業知識,因爲我找不到原因,我卡住了。

此線程遵循以下線索:

STACKOVERFLOW

表可以在那裏下載。

非常感謝您的支持。

乾杯,

馬克

回答

2

在這種情況下,我認爲錯誤是你曾經使用過WHERE NOT EXISTS的方式。如果子查詢不返回任何行,這將返回true。通常,與EXISTSNOT EXISTS一起使用的子查詢將是correlated subquery,它引用外部select(在您的案例中爲fab_booking_slots)中的一列,以便子查詢爲外部select的每一行返回不同的結果。因此,你可能已經知道了足夠的理論(假設它是面向未來的讀者的),你在這裏所做的是你沒有將子查詢與外部參考相關聯。這很複雜,因爲您在外部查詢和子查詢中都使用了相同的表別名slots。我會分配不同的別名以防止混淆。

我簡化了子查詢中的邏輯,這應該仍然會返回正確的結果。請注意,是午夜以後去,所以我們需要通過添加一天的時間,那麼,比較正確地工作來處理它們的時間陷阱:

{thistable}.id IN (
SELECT t.id 
FROM fab_booking_slots AS t 
WHERE t.id = null 
OR NOT EXISTS (
    Select 1 
    From (Select book_date, 
      Convert(book_start, datetime) As book_start, 
      Case When book_end < '02:00:00' Then Date_Add(Convert(book_end, datetime), INTERVAL 1 DAY) Else Convert(book_end, datetime) End As book_end 
      From fab_booking_taken) AS p1 
    Where Date(p1.book_date) = '2017-01-10' 
    And Convert(p1.book_end, datetime) > Convert(t.heuredepart_resa, datetime) 
    And Convert(p1.book_start, datetime) < Case When t.heurearrivee_resa < '02:00:00' Then Date_Add(Convert(t.heurearrivee_resa, datetime), INTERVAL 1 DAY) Else Convert(t.heurearrivee_resa, datetime) End 
) 
) 
Order BY id ASC; 
+0

嗨Mendosi, 非常感謝您答覆和解決方案,因爲sql對我來說仍然「複雜」。 現在,當fab_booking_taken中的預訂已存在所選日期時,查詢工作正常。 但是,如果不存在預訂,則不會返回任何值。查詢應該返回fab_booking_slots表中的所有可用插槽。 – marcq

+0

@marcq何時預訂尚不存在爲{fab_booking ___ book_bookingdate}傳遞了什麼值? – mendosi

+0

下拉是用ajax實現的。當用戶更改日期時,則會顯示下拉菜單。它工作正常,當我選擇一個預訂已經存在的日期,然後顯示可用的插槽。 – marcq