Tôi có bảng 'idtimes' của bảng InnoDB (Nhật ký MySQL 5.0.22) với các cột
`id` int(11) NOT NULL,
`time` int(20) NOT NULL, [...]
với một khóa duy nhất ghép
UNIQUE KEY `id_time` (`id`,`time`)
do đó, có thể có nhiều dấu thời gian cho mỗi id và nhiều id cho mỗi dấu thời gian.
Tôi đang cố gắng thiết lập một truy vấn trong đó tôi nhận được tất cả các mục cộng với thời gian lớn hơn tiếp theo cho mỗi mục, nếu nó tồn tại, vì vậy nó sẽ trả về, ví dụ:
+-----+------------+------------+
| id | time | nexttime |
+-----+------------+------------+
| 155 | 1300000000 | 1311111111 |
| 155 | 1311111111 | 1322222222 |
| 155 | 1322222222 | NULL |
| 156 | 1312345678 | 1318765432 |
| 156 | 1318765432 | NULL |
+-----+------------+------------+
Ngay bây giờ tôi cho đến nay:
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;
nhưng tất nhiên điều này trả về tất cả các hàng có r.time> l.time và không chỉ hàng đầu tiên ...
Tôi đoán tôi sẽ cần một mục phụ như
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;
nhưng tôi không biết làm thế nào để tham khảo thời điểm hiện tại (tôi biết ở trên không phải là SQL hợp lệ).
Làm cách nào để thực hiện việc này với một truy vấn duy nhất (và tôi không muốn sử dụng các biến @ phụ thuộc vào bước mặc dù mỗi lần một bảng và ghi nhớ giá trị cuối cùng)?
is null
và nối với i3where not exists (select 1 from itimes i3 where [same clause])
, thì mã sẽ phản ánh chặt chẽ hơn những gì chúng ta muốn thể hiện.