मेरे पास कॉलमों के साथ एक InnoDB टेबल 'आइडीटम्स' (MySQL 5.0.22-log) है
`id` int(11) NOT NULL,
`time` int(20) NOT NULL, [...]
एक यौगिक अद्वितीय कुंजी के साथ
UNIQUE KEY `id_time` (`id`,`time`)
इसलिए प्रति आईडी में कई टाइमस्टैम्प हो सकते हैं और टाइमस्टैम्प पर कई आईडी हो सकते हैं।
मैं एक क्वेरी सेट करने की कोशिश कर रहा हूं, जहां मुझे सभी प्रविष्टियां मिलती हैं और प्रत्येक प्रविष्टि के लिए अगली अधिक से अधिक समय, यदि यह मौजूद है, तो इसे वापस लौटना चाहिए:
+-----+------------+------------+
| 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])
, तो कोड अधिक बारीकी से प्रतिबिंबित करेगा कि हम क्या व्यक्त करना चाहते हैं।