我有一个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 :(得分:2)
1st获取一组带有每辆自行车最大时间戳的数据,然后根据自行车ID和最大时间戳将其连接回整套。这假设您需要基表中的其他数据。如果你不这样做,单独的内部选择将起作用......
如果您需要表格中的其他数据......
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
答案 1 :(得分: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 /时间戳对应的其他字段。
答案 2 :(得分: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
值,其中North和East为正数。