我很难为这种情况提出SQL语句: 想象一下,在任何时候,道路上都有多辆车, 这些旅行中的每一个都在旅行表中。 每辆车定期发送当前位置(纬度,经度)的更新
有2个表格: CURRENT_POSITION
游
current_position每次旅行都有多个更新
我需要得到结果 trip_id,lat,lon
每次旅行的状态='驾驶' 并且必须拥有最新的价值 CURRENT_POSITION
最新值我的意思是update_time的最高值。 当我尝试GROUP BY时,我得到了明显的结果,但结果并不总是最新的位置。我似乎无法通过update_time DESC和GROUP BY trip_id
组合顺序答案 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