2012-01-20 57 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