2

我知道标题真的很荒谬。我找不到如何描述这一点。

这是我的表结构 在此处输入图像描述

这是一个汽车租赁网页。我正在做的是我试图弄清楚一辆车是否被预订,特别是“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;
4

2 回答 2

1

使用左连接而不是内连接

SELECT
cars.model,
reservations.pickup_date,
reservations.dropoff_date,
reservations.car_id
FROM
cars
LEFT 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'

它也会给你所有尚未预订的汽车

于 2012-04-29T18:40:16.117 回答
0

您需要小心区分在给定时间没有预订的汽车和在给定时间以外的时间有预订的汽车。前者是你所追求的,可以通过一个WHERE NOT IN子句来实现。但是,随着您的汽车和预订系统的发展,这可能会变得非常缓慢。我建议如下:

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' OR
    reservations.dropoff_date >= '2012-04-20 10:50:26'
) AS reserved_cars
ON reserved_cars.car_id = cars.car_id
WHERE reserved_cars.car_id IS NULL;

内部查询是您指定的用于查找所有预留汽车的查询。然后,您将其连接回cars表以查找内部查询未返回的所有汽车。这是有效的,因为您对子查询执行 aLEFT JOIN并且只返回在子查询中没有匹配的行。

编辑:如果您希望查询查找在给定时间段内可用的所有汽车,您的内部查询需要搜索在该时间段内开始或结束的预订。因此,您将使用以下条件:

... WHERE
reservations.pickup_date  BETWEEN '2012-04-08 10:50:26' AND '2012-04-20 10:50:26' OR
reservations.dropoff_date BETWEEN '2012-04-08 10:50:26' AND '2012-04-20 10:50:26'
于 2012-04-29T19:05:08.300 回答