Ho una tabella InnoDB 'idtimes' (MySQL 5.0.22-log) con colonne
`id` int(11) NOT NULL,
`time` int(20) NOT NULL, [...]
con una chiave unica composta
UNIQUE KEY `id_time` (`id`,`time`)
quindi possono esserci più timestamp per ID e più ID per timestamp.
Sto cercando di impostare una query in cui ottengo tutte le voci più il tempo successivo successivo per ciascuna voce, se esiste, quindi dovrebbe restituire ad esempio:
+-----+------------+------------+
| id | time | nexttime |
+-----+------------+------------+
| 155 | 1300000000 | 1311111111 |
| 155 | 1311111111 | 1322222222 |
| 155 | 1322222222 | NULL |
| 156 | 1312345678 | 1318765432 |
| 156 | 1318765432 | NULL |
+-----+------------+------------+
In questo momento sono così lontano:
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;
ma ovviamente questo restituisce tutte le righe con r.time> l.time e non solo il primo ...
Immagino che avrò bisogno di una sottoselezione come
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;
ma non so come fare riferimento all'ora corrente (so che quanto sopra non è SQL valido).
Come posso fare questo con una singola query (e preferirei non usare @variables che dipendono dall'andare nella tabella una riga alla volta e ricordare l'ultimo valore)?
is null
e il join a i3where not exists (select 1 from itimes i3 where [same clause])
, il codice rispecchierebbe più da vicino ciò che vogliamo esprimere.