我有一张表'服务',其中包含有关服务车辆的详细信息。它有一个id和Vehicle_registrationNumber,它是一个外键。无论何时对车辆进行维修,都会产生新的记录。因此,例如,如果我为具有注册ABCD的汽车提供服务,它将创建新行,并且我将在服务表中设置car_reg,日期和汽车里程(id设置为autoincreament)(例如12 | 20/01 / 2012 | ABCD | 1452,同一辆车的另一项服务将创建第15行| 26/01/2012 | ABCD | 4782)。
现在我想检查汽车是否需要服务(最后一次服务是6个月或更长时间,或者自上次服务以来汽车的当前行驶里程超过1000英里),为此我需要知道最后一次服务的日期和最后一次服务的汽车里程数。所以我想创建一个子查询,它将为每辆车返回一行,而我感兴趣的行是最新的一行(具有最大id或最新的endDate)。我还需要将它与其他表连接起来,因为我需要这个用于我的视图(我使用CodeIgniter但不知道是否可以使用CI的ActiveRecord类编写子查询)
SELECT * FROM (
SELECT *
FROM (`service`)
JOIN `vehicle` ON `service`.`Vehicle_registrationNumber` = `vehicle`.`registrationNumber`
JOIN `branch_has_vehicle` ON `branch_has_vehicle`.`Vehicle_registrationNumber` = `vehicle`.`registrationNumber`
JOIN `branch` ON `branch`.`branchId` = `branch_has_vehicle`.`Branch_branchId`
GROUP BY `service`.`Vehicle_registrationNumber` )
AS temp
WHERE `vehicle`.`available` != 'false'
AND `service`.`endDate` <= '2011-07-20 20:43'
OR service.serviceMileage < vehicle.mileage - 10000
答案 0 :(得分:1)
如果不在子查询中使用*,而是指定所需的字段(无论如何总是好的做法),大多数数据库都有一个MAX()函数,它返回组中的最大值。 实际上,你甚至不需要子查询。您可以在SELECT语句中执行连接并使用MAX。然后你可以做类似
的事情SELECT ...., MAX('service'.'end_date') AS LAST_SERVICE
...
GROUP BY 'service'.'Vehicle_registrationNumber'
或者我错过了什么?
答案 1 :(得分:1)
SELECT `service`.`Vehicle_registrationNumber`, Max(`service`.`endDate`) as lastService,
MAX(service.serviceMileage) as lastServiceMileage, vehicle.*
FROM `service`
INNER JOIN `vehicle`
ON `service`.`Vehicle_registrationNumber` = `vehicle`.`registrationNumber`
INNER JOIN `branch_has_vehicle`
ON `branch_has_vehicle`.`Vehicle_registrationNumber` = `vehicle`.`registrationNumber`
INNER JOIN `branch`
ON `branch`.`branchId` = `branch_has_vehicle`.`Branch_branchId`
WHERE vehicle.available != 'false'
GROUP BY `service`.`Vehicle_registrationNumber`
HAVING lastService<=DATE_SUB(CURDATE(),INTERVAL 6 MONTH)
OR lastServiceMileage < vehicle.mileage - 10000
我希望我没有错字。