InnoDBテーブル 'idtimes'(MySQL 5.0.22-log)に列があります
`id` int(11) NOT NULL,
`time` int(20) NOT NULL, [...]
複合一意キー
UNIQUE KEY `id_time` (`id`,`time`)
そのため、IDごとに複数のタイムスタンプがあり、タイムスタンプごとに複数のIDがあります。
私はすべてのエントリに加えて、存在する場合は各エントリの次の大きな時間を取得するクエリを設定しようとしているので、たとえば次のように返されます:
+-----+------------+------------+
| id | time | nexttime |
+-----+------------+------------+
| 155 | 1300000000 | 1311111111 |
| 155 | 1311111111 | 1322222222 |
| 155 | 1322222222 | NULL |
| 156 | 1312345678 | 1318765432 |
| 156 | 1318765432 | NULL |
+-----+------------+------------+
今私はこれまでのところです:
SELECT l.id, l.time, r.time FROM
idtimes AS l LEFT JOIN idtimes AS r ON l.id = r.id
WHERE l.time < r.time ORDER BY l.id ASC, l.time ASC;
もちろん、これは最初の行だけでなく、r.time> l.timeのすべての行を返します...
私は次のようなサブセレクトが必要だと思います
SELECT outer.id, outer.time,
(SELECT time FROM idtimes WHERE id = outer.id AND time > outer.time
ORDER BY time ASC LIMIT 1)
FROM idtimes AS outer ORDER BY outer.id ASC, outer.time ASC;
しかし、現在の時刻を参照する方法がわかりません(上記は有効なSQLではないことを知っています)。
単一のクエリでこれを行うにはどうすればよいですか(そして、テーブルを一度に1行ずつステップし、最後の値を覚えていることに依存する@変数を使用したくない)?
is null
i3へのandの結合をで置き換えた場合where not exists (select 1 from itimes i3 where [same clause])
、コードは表現したいものをより密接に反映すると思います。