排除某些唯一的id,然后对剩下的id进行分组


Excluding certain unique IDs and then grouping the remaining ones

所以我正在建立一个汽车预订网站。有一个cars表是这样的:

汽车

  • CarID
  • CarModel
  • CarMake
  • 登记

还有一个像这样的预订表:

预订:

  • ReservationID
  • CarID
  • StartDate可以
  • EndDate

所以当用户输入他们想预订汽车的日期时,我查询我的预订表:

如果日期已经在预订表中,我想要获得该汽车ID,然后从显示给用户的列表中排除该汽车,以便他们无法预订它。

我的问题是,我有多个汽车在数据库是相同的模式和制造,但有不同的卡和注册。

我还按车型对汽车进行了分组,以便只向用户显示某种类型的一辆汽车。

$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返回true或false

然而,我认为这是错误的方式,因为我想做的是找出哪些汽车由CarID已经采取,然后将它们排除在$getcars查询循环中,该查询循环将所有汽车显示给用户,然后按模型分组。

谁能告诉我一个方法来做这件事,甚至一个更好的方法去做?

排除保留的汽车的一种简单方法是使用子查询获取所有保留的汽车,然后在主查询中使用CarID not in构造

声明这些汽车不允许。
<?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>";
    }
?>

没有实际测试。但是应该可以

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