我正在尝试进行选择,以显示指定目的地在给定时段(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/