У мене є таблиця "idtimes" (MySQL 5.0.22-журнал) InnoDB зі стовпцями
`id` int(11) NOT NULL,
`time` int(20) NOT NULL, [...]
зі складним унікальним ключем
UNIQUE KEY `id_time` (`id`,`time`)
тож може бути декілька часових позначок на 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
i і приєдналися до i3where not exists (select 1 from itimes i3 where [same clause])
, код буде більш точно відображати те, що ми хочемо висловити.