所以我正在建立一个汽车预订网站。有一个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