মাইএসকিউএলে পরবর্তী / পূর্ববর্তী রেকর্ডটি কীভাবে পাবেন?


129

বলুন আমার কাছে 3,4,7,9 আইডি সহ রেকর্ড রয়েছে এবং আমি পরবর্তী / পূর্ববর্তী লিঙ্কগুলির মাধ্যমে নেভিগেশনে একটি থেকে অন্যটিতে যেতে সক্ষম হতে চাই। সমস্যাটি হচ্ছে, আমি নিকটতম উচ্চ আইডি দিয়ে রেকর্ড আনতে জানি না।

সুতরাং যখন আইডি 4 সহ আমার রেকর্ড রয়েছে তখন আমার পরবর্তী বিদ্যমান রেকর্ডটি আনতে সক্ষম হওয়া দরকার যা 7 হবে The

SELECT * FROM foo WHERE id = 4 OFFSET 1

পুরো ফলাফল সেটটি আনতে এবং ম্যানুয়ালি পুনরাবৃত্তি না করে আমি কীভাবে পরবর্তী / পূর্ববর্তী রেকর্ড পেতে পারি?

আমি মাইএসকিউএল 5 ব্যবহার করছি।


8
বাছাইয়ের জন্য আপনার আইডির উপর নির্ভর করা উচিত নয় (এটি হল: আপনার আইডিটি একটি স্বয়ংক্রিয় সংমুক্তি কলাম)। আপনার সারণিতে আরও একটি কলাম তৈরি করা উচিত যা স্পষ্টভাবে সাজানোর ক্রমটি চিত্রিত করে।
ডিসেন্ট ড্যাবলার 21

উত্তর:


258

পরবর্তী:

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)

7
আমি মনে করি সাবকিউরিজগুলি (আইও> আইডি> 4 থেকে মিনিট (আইডি) নির্বাচন করা উচিত এবং আইও <4 যেখানে foo থেকে সর্বোচ্চ (আইডি) নির্বাচন করুন।
ডিসেন্ট ড্যাবলার

1
আপনি ঠিক বলেছেন, আমি FROM ধারাটি ভুলে গেছি এটা ইশারা জন্য ধন্যবাদ. :)
দীর্ঘায়ু

2
এটি সমাধান নয় কারণ আপনি "foo" থেকে সারিটি সরিয়ে ফেললে কী হবে? : পি
ভ্যালেনটিন হিস্টভ

@ ভ্যালেন্টিনহ্রিস্টভ আপনি কী বলছেন তা আমি বুঝতে পারি না। একটি উদাহরণ প্রদান করুন।
লম্বা

@ লম্বনেক আপনি যদি রেকর্ডিংয়ের পরে পোস্ট করেন তবে সবকিছু ঠিক আছে। আপনি যদি সংস্করণ আইডির পরে বিষয়বস্তু পোস্ট করেন তবে ক্রমানুসারে পজিশনের মানদণ্ড নয়।
ভ্যালেন্টিন হ্রিস্টভ

140

সেমক্লেওনকু এর সমাধান ছাড়াও :

পরবর্তী রেকর্ড:

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

পূর্ববর্তী রেকর্ড:

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

সম্পাদনা করুন: যেহেতু এই উত্তরটি ইদানীং কয়েকটি উপার্জন পাচ্ছে, তাই আমি বুঝতে পারছি যে প্রাথমিক কী কলামটি বাছাই করার জন্য একটি কলাম হিসাবে নয়, কারণ মাইএসকিউএল গ্যারান্টি দেয় না যে উচ্চতর, অটো বর্ধিত , মানগুলি পরবর্তী সময়ে যুক্ত করা দরকার।

যদি আপনি এটি সম্পর্কে চিন্তা করেন না এবং কেবল উচ্চ (বা নিম্ন) সহ রেকর্ডের প্রয়োজন হয় idতবে এটি যথেষ্ট will আসলে কোনও রেকর্ড পরে যুক্ত করা হয়েছে কিনা তা নির্ধারণের জন্য কেবল এটি হিসাবে ব্যবহার করবেন না (বা আগে)। স্থির হিসাবে, উদাহরণস্বরূপ, অনুসারে বাছাই করার জন্য একটি ডেটটাইম কলাম ব্যবহার করার কথা বিবেচনা করুন।


আমি এই উত্তরটি অনেক পছন্দ করি, আমি টাইমস্ট্যাম্প অনুসারে বাছাই করি এবং এর অর্থ কোনও উপশম নয়, সুতরাং 4 এর পরিবর্তে মোট 2 টি কোয়েরি
মরিস

61

উপরের সমস্ত সমাধানের জন্য দুটি ডাটাবেস কল প্রয়োজন। নীচের স্ক্যাল কোডটি দুটি স্কেল স্টেটমেন্ট এক সাথে এক করে।

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)
      )    

3
অবশ্যই সেরা সমাধান। দ্রুত এবং সবগুলি একটি ক্যোয়ারিতে।
ডেমন

এমনকি আরও জটিল প্রশ্নের সাথে নিখুঁতভাবে কাজ করে!
তাইয়ার

যোগ করার পদ্ধতি DISTINCTসামনে *এটা আরও ভাল, যে, অবশ্যই যদি করতে হবে idথাকতে পারে 0মান হিসাবে।
এজাজ

দুর্দান্ত সমাধান। প্রথম এবং শেষ রেকর্ডে idদুটি না হয়ে একক ফিরবে ।
lubosdz


12

আমি এর অনুরূপ কিছু করার চেষ্টা করছিলাম, তবে তারিখ অনুসারে আমার অর্ডার করা ফলাফলের প্রয়োজন ছিল যেহেতু আমি বাছাইযোগ্য কলাম হিসাবে আইডি ক্ষেত্রে নির্ভর করতে পারি না। সমাধানটি আমি এখানে নিয়ে এসেছি।

প্রথমে আমরা সারণীতে পছন্দসই রেকর্ডের সূচকটি সন্ধান করি, যখন এটি আমাদের পছন্দ অনুসারে বাছাই করা হয়:

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

আপনার বিবৃত অর্ডার দেওয়া পরবর্তী এবং পূর্ববর্তী রেকর্ডগুলির সাথে আপনাকে আপনার প্রাথমিক রেকর্ড দেয়।

আমি এটি একটি একক ডাটাবেস কল হিসাবে করার চেষ্টা করেছি, কিন্তু এর পরামিতিগুলির মধ্যে একটি হিসাবে একটি ভেরিয়েবল নিতে লিমিট স্টেটমেন্টটি পাইনি।


আমি আপনার পদ্ধতির আগ্রহী আপনি যদি একটি যোগদানের প্রয়োজন হয়? বলুন, নিবন্ধগুলি থেকে একটি যোগ লেখক বি বি.এইচ = এ.এইচ। এটি আমার কাছে উপস্থিত হয় যাতে জয়নগুলি অর্ডারটি মিস করে mes এখানে একটি উদাহরণ পেস্টবিন.
com

1
একটি যোগদান করতে, আপনাকে দুটি পৃথক @ পরিবর্তনযোগ্য সংজ্ঞা দিতে হবে। Current বর্তমান.রো, কারেন্ট.আইডি, পূর্ববর্তী.রো, পূর্ববর্তী আইডি থেকে নির্বাচন করুন (নির্বাচন করুন @ রোাউনাম: = @ রোাউনাম + 1 সারি, ক। * নিবন্ধগুলি থেকে একটি, (নির্বাচন করুন @ আরাউনাম: = 0) আর তারিখের অর্ডার, আইডি) বর্তমান_রো হিসাবে বাম যোগদান করুন (নির্বাচন করুন @ rownum2: = @ rownum2 + 1 সারি, একটি। আইডি) এবং (current_row.row = previous_row.row -1) `
এদুয়ার্দো Moralles

7

এই উদাহরণ চেষ্টা করুন।

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; 

দ্রষ্টব্য: যদি মান পাওয়া যায় না তারপর, এটা ফিরে আসবে নাল

উপরের উদাহরণে পূর্ববর্তী মানটি রাজা হবে এবং পরবর্তী মানটি নাল হবে কারণ পরবর্তী কোনও মান নেই।


7

@ ড্যানের অ্যাপ্রোচ ব্যবহার করে আপনি জয়েনগুলি তৈরি করতে পারেন। প্রতিটি উপ ক্যোয়ারির জন্য কেবল একটি ভিন্ন @ পরিবর্তনশীল ব্যবহার করুন।

SELECT current_row.row, current_row.id, previous_row.row, previous_row.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)

ধন্যবাদ আমার যা দরকার, ধন্যবাদ। মনে রাখবেন যে আপনার নির্বাচনটি সঠিক নয় current-> current_row& previous-> previous_row
লুডোভিক

এই ক্যোয়ারীটি সারণী থেকে রেকর্ডগুলি মুছে ফেলা হয়েছে (অটো_সংশোধন আইডি কলামের ক্রমটি ভঙ্গ হচ্ছে) কিনা তা অনুসন্ধানে কার্যকর হতে পারে।
ধর্মং

@ লুডভিকগুইলুম আপনি আরও সুনির্দিষ্ট করতে পারেন। দুঃখিত, আমি আপনার মন্তব্য বুঝতে পারছি না। তবে ক্যোয়ারিতে পূর্ববর্তী_আর কোনও উপাদান নেই *
ওয়াল্টার শ্রাবমায়ার

4

পরবর্তী সারিতে

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

4

ড্যানের মতো আমারও একই সমস্যা ছিল, তাই আমি তার উত্তরটি ব্যবহার করেছি এবং এটি উন্নত করেছি।

প্রথমে সারি সূচক নির্বাচন করুন, এখানে আলাদা কিছু নয়।

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 এ চলে যাবে এবং আপনি একটি মাইএসকিউএল ত্রুটি পাবেন। এটি প্রতিরোধ করতে আপনি যদি একটি বিবৃতি ব্যবহার করতে পারেন। আগের কোনও রেকর্ড নেই বলে কেবল কিছু নির্বাচন করবেন না। শেষ রেকর্ডের ক্ষেত্রে, পরবর্তী সারিতে থাকবে এবং এর ফলে কোনও ফল হবে না।

এও মনে রাখবেন যে আপনি যদি ডিএসইসি অর্ডার করার জন্য ব্যবহার করেন তবে এএসসির পরিবর্তে, আপনি পরবর্তী এবং পূর্ববর্তী সারিগুলি নির্বাচন করার প্রশ্নগুলি এখনও একই, তবে স্যুইচ করেছেন।


3

এটি একই ফলাফলগুলির শর্তাদির সর্বজনীন সমাধান।

<?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
?>

3

এখানে আমাদের একক মাইএসকিউএল কোয়েরি ব্যবহার করে পূর্ববর্তী এবং পরবর্তী রেকর্ডগুলি আনার একটি উপায় রয়েছে। যেখানে 5 বর্তমান রেকর্ডের আইডি।

select * from story where catagory=100 and  (
    id =(select max(id) from story where id < 5 and catagory=100 and order by created_at desc) 
    OR 
    id=(select min(id) from story where id > 5 and catagory=100 order by created_at desc) )

2

মাইএসকিউএল এবং পিএইচপি-তে পরবর্তী / পূর্ববর্তী রেকর্ড কীভাবে পাবেন?

আমার উদাহরণটি কেবল আইডি পাওয়ার জন্য

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;
  }
}

ডাউনভোটেড কারণ এটি এসকিউএল ইঞ্জেকশনের পক্ষে ঝুঁকিপূর্ণ । আমি জানি এটি একটি পুরানো পোস্ট, তবে নবীন বিকাশকারীদের এটি সম্পর্কে সচেতন হওয়া উচিত।
ayrtonvwf

2

শুধুমাত্র একটি প্রশ্ন ব্যবহার করার জন্য @ দন ​​পদ্ধতির অনুকূলকরণ

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

বর্তমানের নিবন্ধ আইডির মতো কারেন্টআর্টিকালআইডি পরিবর্তন করুন

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

আমি এখানে এ পর্যন্ত এটি সবচেয়ে দরকারী উত্তর পেয়েছি। কেবলমাত্র সত্যিকারের উন্নতির জন্য আমি পরামর্শ দিচ্ছি যে পরিবর্তনগুলি ব্যবহার করা এবং সমস্ত অনন্য অংশগুলিকে সহজে সম্পাদনাযোগ্য হতে শীর্ষে উপরে নিয়ে যাওয়া moving তারপরে সহজেই প্রায়শই রেফারেন্সড ফাংশন বা প্রক্রিয়া তৈরি করা যায়।
liljoshu

1

@ ট্রিকের অনুরূপ একটি ভেরিয়েবল ব্যবহার করে, আপনি চাইলে যে কোনও ক্রম ব্যবহার করে আগের সারিগুলি থেকে কলামগুলি দেখানোর জন্য আরও একটি কৌশল ব্যবহার করতে পারেন:

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

স্পষ্টতই, নির্বাচিত কলামগুলি ক্রমানুসারে মূল্যায়ন করা হয়, সুতরাং এটি প্রথমে সংরক্ষিত ভেরিয়েবলগুলি নির্বাচন করবে এবং তারপরে ভেরিয়েবলগুলি নতুন সারিতে আপডেট করবে (তাদের প্রক্রিয়াতে নির্বাচন করে)।

এনবি: আমি নিশ্চিত নই যে এটি সংজ্ঞায়িত আচরণ, তবে আমি এটি ব্যবহার করেছি এবং এটি কাজ করে।


1

আপনি যদি আপনার ক্যোয়ারীতে একাধিক খাবার খাওয়াতেid চান এবং next_idতাদের সবার জন্য পান ...

cur_idআপনার নির্বাচিত ক্ষেত্রটি বরাদ্দ করুন এবং তারপরে next_idনির্বাচন ক্ষেত্রের ভিতরে gettingুকতে সাব-কোয়্যারিতে এটি খাওয়ান । এবং তারপরে ঠিক নির্বাচন করুন 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;

1
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

6
স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। সম্পূর্ণ কোড সহ উত্তরগুলি খুব কমই কার্যকর। আপনার কোডটি কী করছে তার কিছু ব্যাখ্যা দেওয়ার জন্য দয়া করে বিবেচনা করুন। ইন-কোড ডকুমেন্টেশন এবং / অথবা ইংরেজীতে পরিবর্তনশীল নামগুলিও সহায়ক হবে।
পলিট্যাঙ্ক-জেড

1

আপনার যদি একটি সূচী কলাম থাকে, আইডি বলুন, আপনি পূর্ববর্তী এবং পরবর্তী আইডি এক স্কেল অনুরোধে ফিরে আসতে পারেন। প্রতিস্থাপন করুন: আপনার মান সহ আইডি

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

0

পরবর্তী এবং পূর্বরূপগুলি রেকর্ড পেতে আমার সমাধানটি যদি আমি শেষ এবং বিপরীতে থাকি তবে প্রথম রেকর্ডটিতে ফিরে আসার জন্য

আমি আইডিটি ব্যবহার করছি না আমি সুন্দর url এর জন্য শিরোনামটি ব্যবহার করছি

আমি কোডিগনিটার এইচএমভিসি ব্যবহার করছি

$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;
    }     
}

ডাউনভোটেড কারণ এটি এসকিউএল ইঞ্জেকশনের পক্ষে ঝুঁকিপূর্ণ । আমি জানি এটি একটি পুরানো পোস্ট, তবে নবীন বিকাশকারীদের এটি সম্পর্কে সচেতন হওয়া উচিত।
ayrtonvwf

0

আমার উত্তর এখানে। আমি ' ডেসেন্ট ড্যাবলার ' থেকে একটি ধারণা নিয়েছি এবং আইডিটি ন্যূনতম (আইডি) এবং সর্বোচ্চ (আইডি) এর মধ্যে রয়েছে কিনা তা যাচাই করছে সে অংশটি যুক্ত করব । আমার টেবিল তৈরির জন্য এখানে অংশ।

CREATE TABLE Users (
UserID int NOT NULL auto_increment,
UserName varchar(45),
UserNameID varchar(45),
PRIMARY KEY (UserID)

);

পরবর্তী পদক্ষেপটি একটি সঞ্চিত প্রক্রিয়া তৈরি করছে যা পূর্ববর্তী আইডি পাওয়ার জন্য দায়ী।

    CREATE DEFINER=`root`@`localhost` PROCEDURE `printPreviousIDbySelectedIDUser`(
IN ID int,
IN search_name varchar(45)
)
BEGIN
SELECT CONCAT(ns.UserID) AS 'Previous ID' from Users ns
 where ns.UserName=search_name AND ns.UserID IN (select min(ns.UserID) from Users ns where ns.UserID > ID 
 union select max(ns.UserID) from Users ns where  ns.UserID < ID) LIMIT 1 ;
END

সূচী বাছাই করা থাকলে প্রথম পদ্ধতিটি ভাল তবে তা যদি না হয়। উদাহরণস্বরূপ, আপনার যদি সূচকগুলি থাকে: 1,2,7 এবং আপনাকে অন্য পদ্ধতির ব্যবহারের জন্য আরও ভালভাবে সূচক 2 নম্বর পাওয়া দরকার।

    CREATE DEFINER=`root`@`localhost` PROCEDURE `getPreviousUserID`(
IN ID int,
IN search_name varchar(45)
)
BEGIN
SELECT CONCAT(ns.UserID) AS 'Previous ID' from Users ns
  WHERE ns.UserName=search_name AND  ns.UserID < ID   ORDER BY ns.UserID DESC LIMIT 1;
END

1
নেক্রোমেন্সার ব্যাজটির জন্য শিকার করছেন? এই প্রশ্নের 10 বছর ধরে একটি গ্রহণযোগ্য উত্তর রয়েছে।
জাকুব আর্নল্ড

আমি এই বিষয়টি সন্ধান করেছি, কারণ সম্প্রতি আমি একই সমস্যা পেয়েছি।
ডেনিস

0

100% কাজ করছে

SELECT * FROM `table` where table_id < 3 ORDER BY `table_id` DESC limit 1

-1

আমি মনে করি এসকিউএল টেবিলের আসল পরবর্তী বা পূর্ববর্তী সারিটি সমান সহ আমাদের আসল মান প্রয়োজন, (<বা>) যদি আপনাকে অর্ডারিং সারণীতে সারিটির অবস্থান পরিবর্তন করতে হয় তবে একের বেশি ফেরত দিতে হবে।

আমাদের $positionঅনুসন্ধানের জন্য মূল্য দরকারneighboursসারিটি আমার টেবিলে আমি একটি কলাম 'অবস্থান' তৈরি করেছি

এবং প্রয়োজনীয় সারি পাওয়ার জন্য এসকিউএল কোয়েরি হ'ল:

পরের জন্য :

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

যদি একটি সারি মুছে ফেলা হয় তবে এটি ভেঙে যাবে। উদাহরণস্বরূপ: আইডির সংখ্যা যদি 1,2,6,7,8 হয়।
কেভিন ওয়াটারসন

-2

Foo থেকে শীর্ষ 1 * নির্বাচন করুন যেখানে আইডি> 4 আইডি এসসি দ্বারা আদেশ করুন


1
: সমতুল্য মাইএসকিউএল "সীমা 1" হয় select * from foo where id>4 order by id asc LIMIT 1
ভিড়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.