2015-01-13 59 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,其中北部和东部为正数。