我正在尝试进行选择,以显示指定目的地在给定时段(2016-04-22至2016-04-23)可用的汽车总数。

在这种情况下,我想查看在Mandal可以租用多少辆汽车。但是,在我的查询中,即使我指定了目的地,我也给出了不在Mandal的可用汽车总数。

SELECT destination, COUNT(destination) AS 'available cars'
FROM cars
LEFT JOIN orders
  ON cars.id = orders.car_id
WHERE orders.car_id IS NULL
  OR date_to NOT BETWEEN '2016-04-22' AND '2016-04-23'
  AND date_from NOT BETWEEN '2016-04-22' AND '2016-04-23'
  AND destination = 'Mandal'
GROUP BY destination


运行上面的查询可以得到下表:
http://i.stack.imgur.com/Ck0s0.png

除了Mandal中的可用汽车外,它还只返回Stavanger中的一辆可用汽车,该汽车不应该显示也不正确。在斯塔万格,应该有两辆车可用(一辆在不同时间租用的汽车NOT BETWEEN '2016-04-22' AND '2016-04-23',而另一辆尚未租用的汽车orders.car_id IS NULL)。不过,曼达尔的可用汽车数量是正确的。

最佳答案

括号在构建复杂的WHERE子句时非常重要,因为您可以使用括号将当前范围内的“范围”分组:

   SELECT destination,
          COUNT(sted) AS 'available cars'
     FROM cars
LEFT JOIN orders ON cars.id = orders.car_id
    WHERE (orders.car_id IS NULL)
       OR (date_to NOT BETWEEN '2016-04-22' AND '2016-04-23')
      AND (date_from NOT BETWEEN '2016-04-22' AND '2016-04-23')
      AND (destination = 'Mandal')
 GROUP BY destination


您可能还需要考虑调整范围,以简单地使用小于/大于选项来更准确地定位范围(与BETWEEN语句相对),这可能会更容易阅读:

WHERE (date_from <= '2016-04-23' AND date_to >= '2016-04-22')

关于mysql - MySQL-查找可用日期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36704817/

10-13 05:41