0

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

汽车

  • 车牌
  • 汽车模型
  • 汽车制造商
  • 登记

还有这样的预订表:

预订:

  • 预订编号
  • 车牌
  • 开始日期
  • 结束日期

因此,当用户输入他们想要预订汽车的日期时,我会查询我的预订表:

如果日期已经在预订表中,我想获取该汽车 ID,然后从显示用户的列表中排除该汽车,因此他们无法预订。

我的问题是我在数据库中有多辆汽车,它们的模式和制造方式相同,但 CarID 和注册不同。

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

$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

排除保留的汽车的一种简单方法是使用子查询获取所有保留的汽车,而不是在主查询中声明不允许使用 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>";
    }
?>
于 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 回答