【问题标题】:Mysql subquery with joins带有连接的 Mysql 子查询
【发布时间】:2012-01-20 22:15:53
【问题描述】:

我有一个表“服务”,其中包含有关服务车辆的详细信息。它有一个 id 和作为外键的 Vehicle_registrationNumber。每当维修车辆时,都会制作新记录。因此,例如,如果我为注册 ABCD 的汽车提供服务,它将创建新行,并且我将在服务表中设置 car_reg、日期和汽车里程(id 设置为自动增量)(例如 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

【问题讨论】:

  • 您创建的语句将不起作用,因为一个不太旧的服务条目将被过滤掉。另一个提示英里应该是 1000 或 10000 .. 文本和 sql 语句不同

标签: mysql sql


【解决方案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

;

我希望我没有错字..

【讨论】:

  • 太好了,这按预期工作,并且比我使用子查询的方法更简单、更清晰。非常感谢!
【解决方案2】:

如果不是在子查询中使用 * 而是指定所需的字段(无论如何这始终是一个好习惯),大多数数据库都有一个 MAX() 函数,它返回组内的最大值。 实际上,您甚至不需要子查询。您可以在 SELECT 语句中进行连接并使用 MAX。然后你可以做类似的事情

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

还是我错过了什么?

【讨论】:

  • 你说得对,我不太记得 MAX() 是如何工作的,我以为每条语句只会返回一条记录,我没有考虑将它与 GROUP BY 一起使用。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多