ฉันมีตาราง 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])
รหัสนั้นจะสะท้อนสิ่งที่เราต้องการแสดงออก