限制从内部联接返回的行数

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执行顺序的人:

  1. positions表中没有删除,只有插入
  2. 每辆车每隔几分钟插入一次
  3. 我可以忍受奇怪的异常昙花一现,我觉得这种情况非常罕见
  4. 车辆的细节不太可能改变,我所做的只是增加新的位置

这会让它变得更容易吗?

spe*_*593 6

如果(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中尚不支持这些类型的函数.)