Mysql подзапрос с объединениями - PullRequest
0 голосов
/ 21 января 2012

У меня есть таблица «сервис», которая содержит информацию об обслуживаемых транспортных средствах. У него есть id и Vehicle_registrationNumber, который является внешним ключом. Каждый раз, когда автомобиль обслуживается, делается новая запись. Так, например, если я сделаю сервис для автомобиля с регистрацией ABCD, он создаст новую строку, и я установлю car_reg, дату и пробег автомобиля в сервисной таблице (id установлен на autoincreament) (например, 12 | 20/01 / 2012 | ABCD | 1452, еще один сервис для той же машины создаст ряд 15 | 26.01.2012 | ABCD | 4782).

Теперь я хочу проверить, нуждается ли автомобиль в обслуживании (последнее обслуживание было 6 или более месяцев назад, или текущий пробег автомобиля более 1000 миль с момента последнего обслуживания), чтобы сделать это, мне нужно знать дата последнего обслуживания и пробег автомобиля при последнем обслуживании. Поэтому я хочу создать подзапрос, который будет возвращать по одной строке для каждой машины, и интересующая меня строка является самой новой (либо с наибольшим идентификатором, либо с последней конечной датой). Мне также нужно объединить его с другими таблицами, потому что мне это нужно для моего представления (я использую CodeIgniter, но не знаю, возможно ли писать подзапросы с использованием класса ActiveRecord CI)

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 ]

1 голос
/ 21 января 2012
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

;

Надеюсь, у меня нет опечатки ..

1 голос
/ 21 января 2012

Если вместо использования * в подзапросе вы указываете нужные поля (что всегда является хорошей практикой), большинство баз данных имеют функцию MAX (), которая возвращает максимальное значение в группе.На самом деле, вам даже не нужен подзапрос.Вы можете сделать соединения и использовать MAX в операторе SELECT.Тогда вы можете сделать что-то вроде

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

Или я что-то упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...