2012-01-20 4 views
0

서비스 대상 차량에 대한 세부 정보가 포함 된 'service'테이블이 있습니다. id와 Vehicle_registrationNumber는 외래 키입니다. 차량이 수리 될 때마다 새로운 기록이 만들어집니다. 예를 들어, 등록 ABCD로 자동차 용 서비스를 만들면 새로운 행이 생성되고 service 테이블에 car_reg, date 및 car 's mileage가 설정됩니다 (id는 autoincreament로 설정 됨) (예 : 12 | 20/01/2012 | ABCD | 1452, 같은 차량에 대한 또 다른 서비스가 행 15 | 26/01/2012 | ABCD | 4782)를 만듭니다.조인이 포함 된 Mysql 하위 쿼리

이제 자동차에 서비스가 필요한지 확인하고 싶습니다 (마지막 서비스가 6 개월 전이거나 지난 서비스 이후 1000 마일 이상있는 경우). 마지막 서비스 날짜 및 마지막 서비스시의 차량 주행 거리를 알아야합니다. 그래서 각각의 자동차에 대해 하나의 행을 반환 할 하위 쿼리를 만들고 싶습니다. 관심있는 행은 가장 최신 ID 또는 최신 endDate를 가진 최신 행입니다. 내가보기

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

만약 대신 사용하여 (이것은 CI의 액티브 클래스를 사용하여 하위 쿼리를 작성할 수 있다면 내가 CodeIgniter의를 사용하지만 모르는)이 필요하기 때문에 나는 또한에 * 다른 테이블로 가입해야 하위 쿼리를 사용하면 필요한 필드를 지정할 수 있습니다 (항상 좋은 방법입니다). 대부분의 데이터베이스에는 그룹 내의 최대 값을 반환하는 MAX() 함수가 있습니다. 사실 서브 쿼리가 필요하지 않습니다. SELECT 문에서 조인을 수행하고 MAX를 사용할 수 있습니다. 그런 다음 당신은 뭔가를 할 수 있습니다

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

나는 무엇인가 놓치고 있습니까?

+0

맞습니다. MAX() 작동 방식을 잘 기억하지 못했지만 문당 레코드 하나만 반환한다고 생각하지 않았습니다. GROUP BY와 함께 사용하는 것에 대해 생각해보십시오. 도와 주셔서 대단히 감사합니다! – tomsky