2016-12-04 34 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