0

だから私は車の予約ウェブサイトを構築しています。そして、このような車のテーブルがあります:

  • 車ID
  • 車のモデル
  • カーメイク
  • 登録

また、次のような予約テーブルもあります。

予約:

  • 予約ID
  • 車ID
  • 開始日
  • 終了日

したがって、ユーザーが車を予約したい日付を入力すると、予約テーブルにクエリを実行します。

日付が既に予約テーブルにある場合は、その車の ID を取得し、ユーザーが表示されるリストからその車を除外して、予約できないようにします。

私の問題は、データベースに同じモードとメーカーの車が複数あるが、CarID と登録が異なることです。

また、ユーザーに特定のタイプの車が 1 台だけ表示されるように、モデルごとに車をグループ化します。

$carstring = mysql_query("SELECT * FROM cars {$statement} AND deleted = 'no'" GROUP BY CarModel);

$getcars = $carstring;
while($searchcars = mysql_fetch_array($getcars)) {



   $checkreservations = mysql_query("SELECT * FROM reservations WHERE startDate = '".$sqlcoldate."' and carID = '".$searchcars['carID']."'");
   $thiscar_num_rows = mysql_num_rows($checkreservations);

すぐにわかるように、予約テーブルにどの車が登録されているかがわかります。num_rows

ただし、私がやりたいのは、既に使用されている車を見つけて、すべての車をユーザーに表示するクエリループCarIDから除外し、モデルごとにグループ化することであるため、これは間違った方法だと思います。$getcars

誰かがこれを行う方法、またはそれを行うためのより良い方法を教えてもらえますか?

4

2 に答える 2

0

予約されている車を除外する簡単な方法は、予約されているすべての車を取得するサブクエリを使用して、メインクエリでそれらの車がCarIDNOTIN構造で許可されていないことを示すことです。

<?php 

    // select all cars that are not reserved at sqlcoldate
    $sql = "SELECT * 
    FROM Cars
    WHERE CarID NOT IN (
        SELECT CarID
        FROM Reservations
        WHERE StartDate > '".$sqlcoldate."' and EndDate < '".$sqlcoldate."'
    )
    GROUP BY CarModel";

    // execute that query
    $result = mysql_query($sql);

    // if there are no results print a message
    if (mysql_num_rows($result) == 0) {
        echo "No cars found";
        exit; // Exit the function, because there is nothing to do
    }

    // else print all available cars
    while ($row = mysql_fetch_assoc($result)) {
        echo "Model available car is :" . $row["CarModel"] . " </br>";
    }
?>
于 2013-03-07T10:56:07.057 に答える
0

実際にテストしませんでした。しかし、それはうまくいくはずです

SELECT c.* FROM cars c
LEFT JOIN reservations r
ON c.carID=r.carID AND
selected_date BETWEEN r.startDate AND r.endDate
WHERE r.carID is null
于 2013-03-07T11:00:08.120 に答える