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'

ただし、予約されていない車もあり、すべての車種を予約しているわけではないため、このクエリには表示されません。私は車のテーブルにそれらを持っています。

要するに、このクエリから取得したものを、すべての車のモデルを含むテーブルから削除する必要があります。したがって、予約されていない車+予約日後に利用できる車があります。

クエリから取得した結果を取得し、この結果をcarsテーブルから削除します。その後、それは私に表示されます。

PHPでできます。しかし、mysqlで1クエリでできるのか知りたいです。

これは@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、内部クエリによって返されないすべての車を見つけます。これが機能するのは、サブクエリに対してを実行LEFT 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 に答える