2017-10-22 23 views
1

私は時間間隔でMySQLに大きなクエリを書いている、と今の結果は以下のようになります。MySQLのクエリの時間間隔

id  time  comment 
=========================== 
1  10:00  start 
1  10:10  end 
1  14:30  start 
1  15:20  end 

しかし、私はこのようにそれを行う必要があります。

id start_time end_time 
============================ 
1  10:00  10:10 
1  14:30  15:20 

私はそれを行う方法はありますか?

+2

あなたの「ビッグクエリ」を投稿してください。 –

答えて

2

ああ、自明ではありません。

select id, time as start_time, 
     (select t2.time 
     from t t2 
     where t2.id = t.id and t2.comment = 'end' and t2.time > t.time 
     order by t2.time asc 
     limit 1 
     ) as end_time 
from t 
where comment = 'start'; 

これは、開始と終了が完全にインターリーブされていることを前提としてい - 列内の2つの開始が決してないこと:ここで1つの方法です。

EDIT:

データはより複雑である場合は、開始と終了を注文するために変数を使用することができ、そしてそのことによって集計:

select id, 
     max(case when comment = 'start' then time end) as start_time, 
     max(case when comment = 'end' then time end) as end_time 
from (select t.*, 
      (@s_rn := if(comment = 'start', @s_rn + 1, @s_rn)) as s_rn, 
      (@e_rn := if(comment = 'end', @e_rn + 1, @s_rn)) as e_rn 
     from t cross join 
      (select @s_rn := 0, @e_rn := 0) params 
     order by t.time 
    ) t 
group by id, (case when comment = 'start' then s_rn else e_rn end); 
+0

もちろん、idが同じであるかどうかを確認したいですか? 't.id = t2、id、comment = 'end'、t2.time> t.time'の順で使用され、最初のクエリでは' order by t2.id asc、t2.time asc'も使用されます。 @ RaymondNijland。 –

+0

。 。ありがとうございました。 –

+0

@GordonLinoffありがとうございました! – KidWhoWon