2011-12-29 25 views
1

この状況では、SQL文が出にくいです。 いつでも道路に複数の車両があるとします。 これらのトリップのそれぞれがトリップテーブルにあります。 | current_position2つのテーブルから選択して1つのテーブルから最高の価値を得る方法は?

ID: 各車両は定期的に

は、2つのテーブルがあり、現在の場所(緯度、経度)のアップデートを送信しますtrip_id | update_time | lat | LON

旅行

ID |状態

current_positionは、私は、緯度、 trip_idを持つ、結果を得るために=「DRIVING」 地位を持っており、最新の値を持っている必要があり、各旅行のための経度

を必要とする各旅行

ための複数の更新を持っています current_position

最新の値私はupdate_timeの最高値を意味します。 私はGROUP BYを試してみましたが、結果は必ずしも最新のものではありませんでした。 update_time DESCとGROUP BY trip_idを組み合わせることはできません。

答えて

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サーバーが多いので、私は気づいていないMySQLと若干の違いがあるかもしれない)。 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) 
+0

300回の旅行が現在進行中であるのであれば、このクエリで300サブクエリがあるでしょうか? –

+0

300レコードが返されてもパフォーマンスは問題ありません。それを試してみてください。 – nycdan

+0

DRappは良い点です。 Max(update_time)ではなくMax(id)を使用して、大きなテーブルでより良いパフォーマンスを得ることができます。更新は、私が解析し、一つ一つを挿入し、データのチャンクで衛星ベースのサービスから来るので、理論的には高いidがnecessaraly最新の更新時間を意味するものではありませんので、 – nycdan

-1

、集計カラムなしで基は、それぞれ別個の値のためにあなたの最初の行を与える、そうすることによって後順にグループを使用します。

それは、このように簡単です:旅行IDと最大時間によってprequeryと

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 
+0

current_positionは、ステータスが –

+0

current_positionは、ステータス欄... –

+0

みんなありがとうを持たない旅行のテーブルにある、列のステータス」を持っていない - 私は、クエリを固定:) – Bohemian

1

スタート、最新の時間に基づいて再度参加しているバック。しかし、現在の位置テーブルのID列が自動インクリメント列で、update_timeが常に最新のものより大きい場合は、その時点のmax()を現在の位置のIDの最大値に変更します"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 
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 
     ) 
関連する問題