Maw*_*awg 0 mysql greatest-n-per-group
我有两张桌子,车辆的描述和一个lat/long的理想表格.两个表都有一个Id键(PK和FK).
我的SELECT看起来像这样
SELECT vehicles.id, vehicles.description, vehicles.type,
positions.time_stamp, positions.latitude, positions.longitude
FROM vehicles
INNER JOIN positions
ON vehicles.id=positions.id
Run Code Online (Sandbox Code Playgroud)
我想订购和限制它,以便它只显示每辆车报告的最新poisiotn的连接值.
我怎样才能做到这一点?谢谢
[更新]我创建了这个SqlFiddle演示,它没有提供所需的结果.
我想我需要一些东西
ORDER BY positions.time_stamp DESC
LIMIT SELECT COUNT(*) FROM vehicles
Run Code Online (Sandbox Code Playgroud)
如果只是有效的语法: - /
[进一步更新]对于那些关注thinsg执行顺序的人:
positions表中没有删除,只有插入这会让它变得更容易吗?
如果(id, time_stamp)是唯一的,即同一车辆和同一time_stamp没有两行,则可以使用内联视图(mysql将其称为派生表)来获取每辆车的最新time_stamp.然后,您可以将该派生表连接到位置表,以获取其他列,如下所示:
SELECT v.id
, v.description
, v.type
, p.time_stamp
, p.latitude
, p.longitude
FROM ( SELECT MAX(l.time_stamp) AS max_time_stamp
, l.id
FROM positions l
GROUP BY l.id
) m
JOIN positions p
ON p.id = m.id
AND p.time_stamp = m.max_time_stamp
JOIN vehicles v
ON v.id = p.id
Run Code Online (Sandbox Code Playgroud)
您可以在内联视图中运行该查询(m在上面的查询中分配了别名,以验证这是否为每个车辆返回最新的time_stamp.
如果希望按特定顺序排列结果,可以添加ORDER BY.(此查询有可能为车辆返回多行,IFF最新的time_stamp值出现在同一车辆的两个(或更多)行上.如果没有为车辆复制time_stamp值,则不会发生这种情况.)
适当的索引将加速派生表的创建,并加速连接操作返回到位置表:
CREATE INDEX positions_IX1 ON positions (id,time_stamp)
Run Code Online (Sandbox Code Playgroud)
(在其他关系数据库中,例如Oracle和SQL Server,我们可以使用"分析函数",但MySQL中尚不支持这些类型的函数.)