2012-01-20 58 views
0

我有一个包含服务车辆详细信息的表格“服务”。它有一个id和Vehicle_registrationNumber,它是一个外键。每当车辆进行维修时,都会有新的记录。因此,例如,如果我使用注册ABCD为汽车提供服务,它将创建新的行,并且我将在服务表中设置car_reg,日期和汽车的里程数(id设置为自动增量)(例如12 | 20/01/2012 | ABCD | 1452,同一辆车的另一项服务将创建第15行| 26/01/2012 | ABCD | 4782)。带连接的Mysql子查询

现在我想检查汽车是否需要一项服务(最后一项服务要么是6个月或更长时间,要么是目前的汽车里程已超过自上次服务以来的1000多英里),为此我需要知道最后一次服务的日期和最后一次服务的汽车行驶里程。所以我想创建一个子查询,它会为每辆汽车返回一行,而我感兴趣的行是最新的(无论是最大的ID还是最新的endDate)。我还需要与其他表加入吧,因为我需要为我的观点(我用笨,但不知道是否有可能使用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

创建是行不通的,因为没有那么老服务条目将被过滤掉的声明。另一个提示里程应该是1000或10000 ..不同的文字和sql语句 – rauschen

回答

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 

;

我希望我在这没有错字..

+0

太好了,这个按预期工作,比我用子类的方法更简单,更清晰。非常感谢! – tomsky

1

相反,如果使用*在子查询指定了你需要的字段(无论如何这总是很好的做法),大多数数据库都有一个MAX()函数,它返回组中的最大值。其实,你甚至不需要子查询。您可以在SELECT语句中执行连接并使用MAX。然后你可以做类似

SELECT ...., MAX('service'.'end_date') AS LAST_SERVICE 
... 
GROUP BY 'service'.'Vehicle_registrationNumber' 

或者我错过了什么?

+0

你是对的,我不记得MAX()是如何工作的,我认为它只会为每个语句返回一条记录,而我没有考虑将它与GROUP BY一起使用。非常感谢您的帮助! – tomsky