2015-01-13 60 views
0

我有一個mySQL數據庫來存儲自行車的位置信息。對於'最後位置'的方法,我只想得到自行車的最後一個入口,但是從所有的自行車。獲取最新條目組數據

例子:

ID | ## LAT ## | ## LNG ## | #### TIMESTAMP #### | BIKE_ID 
---------------------------------------------------------- 
16 | N47.68526 | E16.59032 | 2015-01-12 14:49:51 | 3 
17 | N47.36345 | E16.12096 | 2015-01-12 14:50:27 | 9 
18 | N44.12526 | E15.12562 | 2015-01-12 14:51:45 | 1 
19 | N47.87654 | E16.54323 | 2015-01-12 14:51:51 | 3 
20 | N47.12345 | E16.12341 | 2015-01-12 14:52:27 | 1 
21 | N47.12531 | E15.12561 | 2015-01-12 14:52:45 | 9 
22 | N44.12531 | E16.12561 | 2015-01-12 14:53:01 | 1 
23 | N47.12531 | E15.12561 | 2015-01-12 14:53:18 | 9 
... 

我想要的輸出,如:

ID | ## LAT ## | ## LNG ## | #### TIMESTAMP #### | BIKE_ID 
---------------------------------------------------------- 
19 | N47.87654 | E16.54323 | 2015-01-12 14:51:51 | 3 
22 | N44.12531 | E16.12561 | 2015-01-12 14:53:01 | 1 
23 | N47.12531 | E15.12561 | 2015-01-12 14:53:18 | 9 
+0

檢查[此答案](http://stackoverflow.com/questions/27183964/sql-sorting-does-not-follow-group-by-statement-always-uses-primary-key/27184343#27184343), [this one](http://stackoverflow.com/questions/27801243/how-to-select-a-row-with-maximum-value-for-a-column-in-mysql/27801835#27801835),[this一個](http://stackoverflow.com/questions/27036210/sql-select-first-column-and-for-each-row-select-unique-id-and-the-last-date/27036920#27036920)和[this one](http://stackoverflow.com/questions/612231/how-can-i-select-rows-with-maxcolumn-value-distinct-by-another-column-in-sql/27802817#27802817)。 – axiac

+0

我敢打賭,這是關於SO的最常問的MySQL問題。 – axiac

+0

[檢索每個組中的最後一條記錄]的可能的重複(http://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group) –

回答

2

1日得到一組與每輛自行車的最大時間戳的數據,然後再加入回基於整套自行車編號和最大時間戳。假設您需要基表中的其他數據。如果你不把內心的選擇僅此一項就工作...

如果需要從表中其他數據...

SELECT t.id AS 'ID', 
     t.lat AS '## LAT ##', 
     t.lng AS '## LNG ##', 
     t.timestamp AS '#### TIMESTAMP ####', 
     t.bike_Id AS 'BIKE_ID' 
FROM table_Name t 
INNER JOIN (SELECT bike_ID, max(timestamp) mts 
      FROM tableName 
      GROUP BY bike_ID) t2 
    on t2.bike_ID = t.bike_ID 
and t2.mts = t.timestamp 

如果不是...只是使用聚合...

SELECT bike_ID, 
     max(timestamp) mts 
FROM tableName 
GROUP BY bike_ID 
0

基本上這樣的:

SELECT * 
FROM yourtable 
INNER JOIN (
    SELECT BIKE_ID, MAX(TIMESTAMP) 
    FROM yourtable 
    GROUP BY BIKE_ID 
) AS foo ON ((yourtable.BIKE_ID = foo.BIKE_ID) AND (yourtable.TIMESTAMP = foo.TIMESTAMP)) 

提交查詢每一個自行車ID,然後您可以用它來最高時間戳自加入反對原始表格來選擇與這些id /時間戳相對應的其他字段。

0

這個問題相當普遍,並且有一個優雅的優化。如果您最後一項保證是一個與id最高值(也就是,如果你的id列是自動增量列,表中記錄新數據),這樣做:

SELECT t.BIKE_ID, t.LAT, t.LNG, t.`TIMESTAMP` 
    FROM table t 
    JOIN (SELECT MAX(ID) AS ID 
      FROM table 
     GROUP BY BIKE_ID 
     ) m ON t.ID = m.ID 

的內部查詢(MAX ... GROUP BY)有效地識別最近的每輛自行車進入。如果你把複合索引(BIKE_ID, ID)你的桌子上,這個查詢將是非常有效的確實的,因爲它可以做一個所謂的loose index scan

臨提示。製作你的緯度和高度其值爲FLOAT,其中北部和東部爲正數。