我知道标题真的很荒谬。我找不到如何描述这一点。
这是我的表结构
这是一个汽车租赁网页。我正在做的是我试图弄清楚一辆车是否被预订,特别是“pickup_date”和“dropoff_date”。我可以通过此查询获得预订的汽车
SELECT
cars.model,
reservations.pickup_date,
reservations.dropoff_date,
reservations.car_id
FROM
cars
INNER JOIN reservations ON cars.car_id = reservations.car_id
WHERE
reservations.pickup_date <= '2012-04-08 10:50:26' OR
reservations.dropoff_date >= '2012-04-20 10:50:26'
但是,有一些汽车没有被预订并且它们没有显示在这个查询中,因为我没有预订所有车型。我把它们放在汽车桌子上。
最重要的是,我应该从包含所有汽车型号的表中消除从该查询中获得的那些。因此,我将拥有未预订的汽车 + 在预订日期之后可用的汽车。
它会得到我从查询中得到的结果,并从汽车表中消除这个结果。之后它会告诉我。
我可以用 PHP 做到这一点。但是,我想了解是否可以使用 mysql 进行一次查询。
这是我在@cbuckley 的帮助下提出的解决方案
SELECT
cars.*
FROM cars
LEFT JOIN (
SELECT
cars.car_id
FROM
cars
INNER JOIN reservations
ON cars.car_id = reservations.car_id
WHERE
(reservations.pickup_date <= '2012-04-08 10:50:26' AND reservations.dropoff_date >= '2012-04-20 10:50:26') OR
(reservations.pickup_date >= '2012-04-08 10:50:26' AND reservations.pickup_date <= '2012-04-20 10:50:26') OR
(reservations.dropoff_date <= '2012-04-20 10:50:26' AND reservations.dropoff_date >= '2012-04-08 10:50:26')
) AS reserved_cars
ON reserved_cars.car_id = cars.car_id
WHERE reserved_cars.car_id IS NULL;