排除某些唯一ID,然后将其余ID分组

时间:2013-03-07 10:28:22

标签: php mysql

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

汽车

  • CarID
  • CarModel
  • CarMake
  • 注册

还有这样的预订表:

预订:

  • ReservationID
  • CarID
  • 开始日期
  • 结束日期

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

如果日期已经在预订表中,我想获取该车辆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查询循环中排除汽车给用户,然后按模型分组。

有谁能告诉我这样做的方法,甚至是更好的方法呢?

2 个答案:

答案 0 :(得分: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>";
    }
?>

答案 1 :(得分: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