如何从2个表中进行选择并从一个表中获得最高价值?

时间:2011-12-29 20:12:55

标签: mysql greatest-n-per-group

我很难为这种情况提出SQL语句: 想象一下,在任何时候,道路上都有多辆车, 这些旅行中的每一个都在旅行表中。 每辆车定期发送当前位置(纬度,经度)的更新

有2个表格: CURRENT_POSITION

id | trip_id | update_time | lat | LON

id |状态

current_position每次旅行都有多个更新

我需要得到结果 trip_id,lat,lon

每次旅行的状态='驾驶' 并且必须拥有最新的价值 CURRENT_POSITION

最新值我的意思是update_time的最高值。 当我尝试GROUP BY时,我得到了明显的结果,但结果并不总是最新的位置。我似乎无法通过update_time DESC和GROUP BY trip_id

组合顺序

4 个答案:

答案 0 :(得分:1)

听起来你想要为给定的trip_id选择具有最大update_time值的current_position行。您可以使用MAX来使用子查询执行此操作。

Select * from current_position
Where trip_id = @trip_id 
and update_time = (Select Max(update_time) from current_position where trip_id = @trip_id)

编辑...发布后,我意识到你需要一个联接来获取相应的旅行状态='驾驶'的所有行。我认为这样做(虽然我更多的是Sql Server,所以可能与我不知道的MySQL有一些细微的差别)。

Select * from current_position cp
join trips t on cp.trip_id = t.id
where t.status = 'Driving' 
and cp.update_time = (select Max(update_time) from current_position where trip_id = t.id)

答案 1 :(得分:1)

从旅程ID和最长时间开始查询,然后根据最近的时间重新加入。但是,如果当前位置表的ID列是自动增量列,并且update_time将始终大于报告的最后一个,我会改为将时间的max()更改为当前位置的最大值在“PreQuery”

之后加入时,表格最好是分组依据和索引

我还会根据状态在您的旅行表上有一个索引,以缩短您的查询结果。随着你的桌子建立起来,如果你开始有10,000次旅行,而且目前只有15个是为了交付(或者其他),那么你只会得到那些活跃的15并且不会跨越整个旅行表。

select
      cp2.*
  from
      ( select t.id, 
               max( cp.update_time ) as MostRecent
           from
              trips t
                 join current_position cp
                   on t.id = cp.trip_id
           where
              t.status = 'Driving'
           group by 
              t.id ) PreQuery
      join current_position cp2
         on PreQuery.id = cp2.trip_id
         and PreQuery.MostRecent = cp2.update_time

答案 2 :(得分:0)

另一种方式:

SELECT
    cp.*
FROM
        ( SELECT id
          FROM trips 
          WHERE status = 'DRIVING'
        ) AS t
    JOIN
        current_position AS cp 
      ON
        cp.id =
        ( SELECT cpm.id
          FROM current_position AS cpm
          WHERE cpm.trip_id = t.id
          ORDER BY cpm.update_time DESC
          LIMIT 1
        )

答案 3 :(得分:-1)

使用mysql,group by而不使用聚合列为每个不同的值提供第一行,因此在订单后按使用group。

这很简单:

select trip_id, lat, lon
from (select * from current_position
      join trips on trips.id = current_position.id
      where status = 'DRIVING'
      order by trip_id, update_time desc) x
group by trip_id