带连接的Mysql子查询

时间:2012-01-20 22:15:53

标签: mysql sql

我有一张表'服务',其中包含有关服务车辆的详细信息。它有一个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

2 个答案:

答案 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

我希望我没有错字。