열이있는 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이 유효하지 않다는 것을 알고 있습니다).
단일 쿼리 로이 작업을 수행하는 방법은 무엇입니까? (한 번에 한 행씩 테이블을 밟고 마지막 값을 기억하는 것에 의존하는 @variables를 사용하지 않으려는 경우)?
is null
와 i3에 대한 조인을로 바꾸면where not exists (select 1 from itimes i3 where [same clause])
코드가 표현하려는 것을 더 자세히 반영한다고 생각합니다.