दिलचस्प पोस्ट
क्या एक शब्द-शाब्दिक और एक कनिष्ठ रचनाकार का उपयोग करने में कोई अंतर है? क्या पता चलता है कि एक कार्यालय ओपन एक्सएमएल सेल में दिनांक / समय मान है? व्यवहार ggplot2 एईएस () facet_grid () के साथ संयोजन में जब एईएस (डॉलर) के लिए डॉलर के संकेत चिह्न के साथ चर गुजर रहा है स्थापना पर एंड्रॉइड सेवा कैसे आरंभ करें एक खेल में फ्रेम प्रति सेकंड की गणना जांचें कि क्या वर्ष जावा स्क्रिप्ट में वर्ष है डॉकर कन्टेनर की फ़ाइल सिस्टम तलाश रहा है एक नियंत्रक में पैरामीटर से एक Grails तिथि बाध्यकारी MySQL JDBC ड्राइवर का उपयोग करके एंड्रॉइड के साथ कनेक्ट करने के लिए कैसे करें क्या मैं बीओएम के बिना यूटीएफ -8 के साथ एक्सल डेटा निर्यात कर सकता हूं? पीएचपी दिन का सप्ताह संख्यात्मक से सप्ताह के पाठ के दिन सक्रिय निर्देशिका उपयोगकर्ता पासवर्ड समाप्ति दिनांक। नेट / ओयू समूह नीति पायथन 2 में विस्तारित टपल अनपैकिंग आईओएस 8: बंडल मार्ग परिवर्तन सी में रेखा से एक पाठ फ़ाइल लाइन के माध्यम से जा रहे हैं

MySQL में अगले / पिछले रिकॉर्ड कैसे प्राप्त करें?

कहें कि मेरे पास आईडी 3,4,7,9 के साथ रिकॉर्ड हैं और मैं अगले / पिछले लिंक्स के माध्यम से नेविगेशन द्वारा एक दूसरे से जाने में सक्षम होना चाहता हूं। समस्या यह है, कि मुझे नहीं पता कि निकटतम उच्च आईडी के साथ रिकॉर्ड कैसे लाया जाए

इसलिए जब मेरे पास आईडी 4 के साथ एक रिकार्ड है, तो मुझे अगले मौजूदा रिकॉर्ड को प्राप्त करने में सक्षम होना चाहिए, जो 7 होगा। क्वेरी शायद कुछ ऐसा दिखाई देगी

SELECT * FROM foo WHERE id = 4 OFFSET 1 

मैं पूरे परिणाम सेट को लाए बिना अगले / पिछले रिकॉर्ड कैसे ला सकता हूं और मैन्युअल रूप से इटरेटिंग कर सकता हूं?

मैं MySQL 5 का उपयोग कर रहा हूँ

Solutions Collecting From Web of "MySQL में अगले / पिछले रिकॉर्ड कैसे प्राप्त करें?"

आगामी:

 select * from foo where id = (select min(id) from foo where id > 4) 

पिछला:

 select * from foo where id = (select max(id) from foo where id < 4) 

सेमेक्लिन्को के समाधान के अलावा:

अगले रिकॉर्ड:

 SELECT * FROM foo WHERE id > 4 ORDER BY id LIMIT 1; 

पिछला रिकॉर्ड:

 SELECT * FROM foo WHERE id < 4 ORDER BY id DESC LIMIT 1; 

संपादित करें: चूंकि यह जवाब हाल ही में कुछ अपवोट्स प्राप्त हो रहा है, मैं वास्तव में इस बात पर जोर देना चाहता हूं कि मैंने पहले यह समझने के लिए बनाया था कि प्राथमिक कुंजी कॉलम का मतलब किसी स्तंभ के रूप में क्रमबद्ध नहीं है, क्योंकि MySQL गारंटी नहीं देता कि उच्चतर वृद्धि हुई है , बाद के समय में मूल्य जरूरी जोड़ दिया जाता है

यदि आप इस बारे में परवाह नहीं करते हैं, और केवल एक उच्च (या निम्न) id साथ रिकार्ड की आवश्यकता है तो यह पर्याप्त होगा। बस यह निर्धारित करने के लिए एक साधन के रूप में इसका उपयोग न करें कि क्या रिकॉर्ड वास्तव में बाद में जोड़ा गया है (या पहले)। जगह में, उदाहरण के लिए, क्रमबद्ध करने के लिए एक datetime स्तंभ का उपयोग करने पर विचार करें।

सभी उपरोक्त समाधानों के लिए दो डेटाबेस कॉल की आवश्यकता होती है। नीचे एसक्यूएल कोड दो एसक्यूएल स्टेटमेंट्स को एक में जोड़ता है

 select * from foo where ( id = IFNULL((select min(id) from foo where id > 4),0) or id = IFNULL((select max(id) from foo where id < 4),0) ) 
 SELECT * FROM foo WHERE id>4 ORDER BY id LIMIT 1 

मैं इसके जैसा कुछ करने का प्रयास कर रहा था, लेकिन मुझे तिथि के अनुसार परिणाम की आवश्यकता थी क्योंकि मैं आईडी फ़ील्ड पर क्रमबद्ध स्तंभ के रूप में भरोसा नहीं कर सकता। यहाँ मैं समाधान के साथ आया है।

सबसे पहले हम टेबल में वांछित रिकार्ड का सूचक पता लगाते हैं, जब यह सॉर्ट किया जाता है जैसा कि हम चाहते हैं:

 SELECT row FROM (SELECT @rownum:=@rownum+1 row, a.* FROM articles a, (SELECT @rownum:=0) r ORDER BY date, id) as article_with_rows WHERE id = 50; 

फिर 2 के परिणाम को कम करके सीमा विवरण में डाल दें। उदाहरण के लिए ऊपर दिए मेरे लिए 21 लौटे हैं, इसलिए मैं चलाता हूं:

 SELECT * FROM articles ORDER BY date, id LIMIT 19, 3 

आपको अपना प्राथमिक रिकार्ड दिया गया है, साथ ही यह आपके अगले आदेश के अनुसार दिया गया है।

मैंने इसे एक एकल डेटाबेस कॉल के रूप में करने की कोशिश की, लेकिन इसके एक पैरामीटर के रूप में एक वैरिएबल लेने के लिए LIMIT कथन नहीं मिल सका।

मुझे डैन के समान समस्या थी, इसलिए मैंने उसका जवाब इस्तेमाल किया और इसे बेहतर बनाया

पहले पंक्ति इंडेक्स का चयन करें, यहाँ कुछ भी नहीं।

 SELECT row FROM (SELECT @rownum:=@rownum+1 row, a.* FROM articles a, (SELECT @rownum:=0) r ORDER BY date, id) as article_with_rows WHERE id = 50; 

अब दो अलग-अलग प्रश्नों का उपयोग करें उदाहरण के लिए यदि पंक्ति अनुक्रमणिका 21 है, तो अगले रिकॉर्ड को चुनने के लिए प्रश्न निम्न होगा:

 SELECT * FROM articles ORDER BY date, id LIMIT 21, 1 

पिछले रिकॉर्ड का चयन करने के लिए इस क्वेरी का उपयोग करें:

 SELECT * FROM articles ORDER BY date, id LIMIT 19, 1 

ध्यान रखें कि पहली पंक्ति (पंक्ति अनुक्रमणिका 1) के लिए, सीमा 1 पर जाएगी और आपको एक MySQL त्रुटि मिलेगी आप इसे रोकने के लिए एक आई-स्टेटमेंट का उपयोग कर सकते हैं। बस कुछ भी नहीं चुनिए, क्योंकि वैसे भी कोई पिछला रिकॉर्ड नहीं है। अंतिम रिकॉर्ड के मामले में, अगली पंक्ति होगी और इसके लिए कोई परिणाम नहीं होगा।

यह भी ध्यान में रखें कि यदि आप एएससी के बदले ऑर्डर करने के लिए डीईएससी का उपयोग करते हैं, तो आप अगली और पिछली पंक्तियों को चुनने के लिए पूछताछ करते हैं, लेकिन स्विच किए गए हैं

डान के दृष्टिकोण का उपयोग करके, आप JOIN को जोड़ सकते हैं बस प्रत्येक उप क्वेरी के लिए एक भिन्न @ वैरिएबल का उपयोग करें

 SELECT current.row, current.id, previous.row, previous.id FROM ( SELECT @rownum:=@rownum+1 row, a.* FROM articles a, (SELECT @rownum:=0) r ORDER BY date, id ) as current_row LEFT JOIN ( SELECT @rownum2:=@rownum2+1 row, a.* FROM articles a, (SELECT @rownum2:=0) r ORDER BY date, id ) as previous_row ON (current_row.id = previous_row.id) AND (current_row.row = previous_row.row - 1) 

इस उदाहरण की कोशिश करो

 create table student(id int, name varchar(30), age int); insert into student values (1 ,'Ranga', 27), (2 ,'Reddy', 26), (3 ,'Vasu', 50), (5 ,'Manoj', 10), (6 ,'Raja', 52), (7 ,'Vinod', 27); SELECT name, (SELECT name FROM student s1 WHERE s1.id < s.id ORDER BY id DESC LIMIT 1) as previous_name, (SELECT name FROM student s2 WHERE s2.id > s.id ORDER BY id ASC LIMIT 1) as next_name FROM student s WHERE id = 7; 

नोट: अगर मूल्य नहीं मिला तो यह शून्य हो जाएगा।

उपरोक्त उदाहरण में, पिछला मूल्य राजा होगा और अगला मान शून्य हो जाएगा क्योंकि कोई अगली मूल्य नहीं है।

अगली पंक्ति

 SELECT * FROM `foo` LIMIT number++ , 1 

पिछला पंक्ति

 SELECT * FROM `foo` LIMIT number-- , 1 

अगला पंक्ति नमूना

 SELECT * FROM `foo` LIMIT 1 , 1 SELECT * FROM `foo` LIMIT 2 , 1 SELECT * FROM `foo` LIMIT 3 , 1 

पिछले पंक्ति का नमूना

 SELECT * FROM `foo` LIMIT -1 , 1 SELECT * FROM `foo` LIMIT -2 , 1 SELECT * FROM `foo` LIMIT -3 , 1 SELECT * FROM `foo` LIMIT 3 , 1 SELECT * FROM `foo` LIMIT 2 , 1 SELECT * FROM `foo` LIMIT 1 , 1 

MySQL और PHP में अगले / पिछले रिकॉर्ड कैसे प्राप्त करें?

मेरा उदाहरण केवल आईडी प्राप्त करना है

 function btn_prev(){ $id = $_POST['ids']; $re = mysql_query("SELECT * FROM table_name WHERE your_id < '$id' ORDER BY your_id DESC LIMIT 1"); if(mysql_num_rows($re) == 1) { $r = mysql_fetch_array($re); $ids = $r['your_id']; if($ids == "" || $ids == 0) { echo 0; } else { echo $ids; } } else { echo 0; } } function btn_next(){ $id = $_POST['ids']; $re = mysql_query("SELECT * FROM table_name WHERE your_id > '$id' ORDER BY your_id ASC LIMIT 1"); if(mysql_num_rows($re) == 1) { $r = mysql_fetch_array($re); $ids = $r['your_id']; if($ids == "" || $ids == 0) { echo 0; } else { echo $ids; } } else { echo 0; } } 

यह स्थिति के लिए सार्वभौमिक समाधान है और इसके परिणाम बहुत अधिक हैं।

 <?php $your_name1_finded="somethnig searched"; //$your_name1_finded must be finded in previous select $result = db_query("SELECT your_name1 FROM your_table WHERE your_name=your_condition ORDER BY your_name1, your_name2"); //Get all our ids $i=0; while($row = db_fetch_assoc($result)) { //Loop through our rows $i++; $current_row[$i]=$row['your_name1'];// field with results if($row['your_name1'] == $your_name1_finded) {//If we haven't hit our current row yet $yid=$i; } } //buttons if ($current_row[$yid-1]) $out_button.= "<a class='button' href='/$your_url/".$current_row[$yid-1]."'>BUTTON_PREVIOUS</a>"; if ($current_row[$yid+1]) $out_button.= "<a class='button' href='/$your_url/".$current_row[$yid+1]."'>BUTTON_NEXT</a>"; echo $out_button;//display buttons ?> 

एक और चाल है जिसे आप पिछले पंक्तियों से कॉलम दिखाने के लिए उपयोग कर सकते हैं, जिसे आप चाहते हैं, @row चाल के समान वैरिएबल का उपयोग कर किसी भी आदेश का उपयोग कर सकते हैं:

 SELECT @prev_col_a, @prev_col_b, @prev_col_c, @prev_col_a := col_a AS col_a, @prev_col_b := col_b AS col_b, @prev_col_c := col_c AS col_c FROM table, (SELECT @prev_col_a := NULL, @prev_col_b := NULL, @prev_col_c := NULL) prv ORDER BY whatever 

जाहिर है, चुनिंदा कॉलम क्रम में मूल्यांकन किए जाते हैं, इसलिए यह पहले सहेजे गए व्हेरिएबल्स का चयन करेगा, और फिर वेरिएबल को नई पंक्ति में अपडेट करें (प्रक्रिया में उन्हें चुनना)।

NB: मुझे यकीन नहीं है कि यह परिभाषित व्यवहार है, लेकिन मैंने इसका इस्तेमाल किया है और यह काम करता है।

यदि आप अपनी क्वेरी में एक से अधिक id फ़ीड करना चाहते हैं और सभी के लिए next_id प्राप्त करें …

अपने चयन के क्षेत्र में cur_id असाइन करें और उसके बाद चयन क्षेत्र के अंदर next_id मिलने के लिए इसे फ़ीड करें। और फिर बस next_id चयन करें

अगली_आईडी को लम्बे समय के जवाब का प्रयोग करना:

 select next_id from ( select id as cur_id, (select min(id) from `foo` where id>cur_id) as next_id from `foo` ) as tmp where next_id is not null; 
 CREATE PROCEDURE `pobierz_posty`(IN iduser bigint(20), IN size int, IN page int) BEGIN DECLARE start_element int DEFAULT 0; SET start_element:= size * page; SELECT DISTINCT * FROM post WHERE id_users .... ORDER BY data_postu DESC LIMIT size OFFSET start_element END 

यदि आपके पास एक इंडेक्स कॉलम है, तो आईडी कहते हैं, तो आप एक एसक्यूएल अनुरोध में पिछले और अगले आईडी को वापस कर सकते हैं। बदलें: अपने मूल्य के साथ आईडी

 SELECT IFNULL((SELECT id FROM table WHERE id < :id ORDER BY id DESC LIMIT 1),0) as previous, IFNULL((SELECT id FROM table WHERE id > :id ORDER BY id ASC LIMIT 1),0) as next 

मेरे समाधान का अगला और पूर्वावलोकन रिकॉर्ड भी प्राप्त करने के लिए पहले रिकॉर्ड पर वापस जाने के लिए अगर मैं आखिरी और इसके विपरीत द्वारा हूं

मैं आईडी का उपयोग नहीं कर रहा हूँ, मैं अच्छा यूआरएल के लिए शीर्षक का उपयोग कर रहा हूं

मैं Codeigniter एचएमवीसी का उपयोग कर रहा हूँ

 $id = $this->_get_id_from_url($url); //get the next id $next_sql = $this->_custom_query("select * from projects where id = (select min(id) from projects where id > $id)"); foreach ($next_sql->result() as $row) { $next_id = $row->url; } if (!empty($next_id)) { $next_id = $next_id; } else { $first_id = $this->_custom_query("select * from projects where id = (SELECT MIN(id) FROM projects)"); foreach ($first_id->result() as $row) { $next_id = $row->url; } } //get the prev id $prev_sql = $this->_custom_query("select * from projects where id = (select max(id) from projects where id < $id)"); foreach ($prev_sql->result() as $row) { $prev_id = $row->url; } if (!empty($prev_id)) { $prev_id = $prev_id; } else { $last_id = $this->_custom_query("select * from projects where id = (SELECT MAX(id) FROM projects)"); foreach ($last_id->result() as $row) { $prev_id = $row->url; } } 

केवल एक प्रश्न का उपयोग करने के लिए @ दॉन दृष्टिकोण का अनुकूलन करना

 SELECT * from ( SELECT @rownum:=@rownum+1 row, CASE a.id WHEN 'CurrentArticleID' THEN @currentrow:=@rownum ELSE NULL END as 'current_row', a.* FROM articles a, (SELECT @currentrow:=0) c, (SELECT @rownum:=0) r ORDER BY `date`, id DESC ) as article_with_row where row > @currentrow - 2 limit 3 

CurrentArticleID को चालू आलेख आईडी जैसे की तरह बदलें

 SELECT * from ( SELECT @rownum:=@rownum+1 row, CASE a.id WHEN '100' THEN @currentrow:=@rownum ELSE NULL END as 'current_row', a.* FROM articles a, (SELECT @currentrow:=0) c, (SELECT @rownum:=0) r ORDER BY `date`, id DESC ) as article_with_row where row > @currentrow - 2 limit 3 

शीर्ष 1 * का चयन करें foo से जहां id> 4 ऑर्डर से आईडी एसीसी

मुझे लगता है कि एसक्यूएल तालिका में वास्तविक अगले या पिछली पंक्ति के लिए हमें वास्तविक मूल्य के साथ वास्तविक मूल्य की आवश्यकता है, (यदि कोई ऑर्डरिंग टेबल में पंक्ति की स्थिति को बदलने की आवश्यकता है, तो एक से अधिक वापसी)।

हमें neighbours पंक्ति खोज करने के लिए मूल्य $position की आवश्यकता है मेरी तालिका में मैंने एक कॉलम 'स्थिति'

और आवश्यक पंक्ति प्राप्त करने के लिए SQL क्वेरी है:

अगले के लिए :

 SELECT * FROM `my_table` WHERE id = (SELECT (id) FROM my_table WHERE position = ($position+1)) LIMIT 1 

पिछले के लिए:

  SELECT * FROM my_table WHERE id = (SELECT (id) FROM my_table WHERE `position` = ($position-1)) LIMIT 1