2017-03-03 91 views
0

我有2個表,Car_Table和History_Table。我希望能夠在狀態設置爲中斷時爲所有汽車選擇最後的歷史記錄。如何在連接表中按日期選擇最後一條記錄

的表如下所示

Car_Table 
Car_ID Driver_Name Car_Status 
1  Alan  Broken 
2  Dave  Broken 

History_Table 
id Date  Notes  Car_Id 
1 01-01-2017 Change oil  1 
2 02-01-2017 Check Brakes 1 
3 02-01-2017 Service   2 
3 03-01-2017 Cleaning  2 

當我做

select Car_Table.Driver_Name,History_Table.Notes from Car_Table 
inner join History_Table on Car_Table.Car_ID = History_Table.CarID 
where Car_Table.Car_Status = 'Broken' 

我得到的所有的歷史記錄返回。有沒有辦法讓每輛車狀態爲「壞」的最後一個歷史項目?

回答

4

您可以找到使用left join技術,然後用Car_table加入它每節車廂最多日行:

select Car_Table.Driver_Name, 
    History_Table.Notes 
from Car_Table 
inner join (
    select h1.* 
    from History_Table h1 
    left join History_Table h2 on h1.Car_ID = h2.Car_ID 
     and h1.date < h2.date 
    where h2.Car_ID is null 
    ) History_Table on Car_Table.Car_ID = History_Table.CarID 
where Car_Table.Car_Status = 'Broken'; 

見MySQL官方網站替代解決方案(在相關和不相關子查詢使用聚合,這可能會比上面的解決方案慢)。

+1

請注意,這個解決方案的規模不佳 – Strawberry

+0

@Strawberry - 我已經添加了一個鏈接到示例,該解決方案的其他兩個替代方案也。 – GurV

+0

更慢?幾乎不! – Strawberry

1

您可以使用子查詢來獲得最後一個記錄。理想情況下,如果記錄的數量很大,則應在'日期'字段中有一個索引。

 
select Car_Table.Driver_Name,History_Table.Notes 
    from Car_Table 
    inner join History_Table on Car_Table.Car_ID = History_Table.CarID 
    and History_Table.id=(
     select History_Table2.id 
     from History_Table2 
     Where History_Table2.CarID=History_Table.CarID 
     Order by date desc 
     Limit 1 
    ) 
    where Car_Table.Car_Status = 'Broken' 
1

最有效的方式來獲得這些報告將是創建在Car_Table一個額外的列last_history_id。每次將記錄插入到History_Table時,觸發器都會更新Car_Table中的last_history_id列。它會減少選擇所需數據集的讀取延遲,但在某些情況下,如果一次執行許多更新,這可能是一個竅門。

相關問題