จะรับบันทึกถัดไป / ก่อนหน้าใน MySQL ได้อย่างไร


129

สมมติว่าฉันมีบันทึกที่มี ID 3,4,7,9 และฉันต้องการที่จะเปลี่ยนจากที่หนึ่งไปยังอีกที่หนึ่งโดยการนำทางผ่านลิงก์ถัดไป / ก่อนหน้า ปัญหาคือฉันไม่รู้วิธีดึงข้อมูลที่มี ID ที่สูงกว่าที่ใกล้ที่สุด

ดังนั้นเมื่อฉันมีเรกคอร์ดที่มี ID 4 ฉันต้องสามารถดึงเรกคอร์ดที่มีอยู่ถัดไปได้ซึ่งจะเป็น 7 คิวรีน่าจะมีลักษณะคล้าย ๆ

SELECT * FROM foo WHERE id = 4 OFFSET 1

ฉันจะดึงข้อมูลระเบียนถัดไป / ก่อนหน้าโดยไม่ดึงชุดผลลัพธ์ทั้งหมดและทำซ้ำด้วยตนเองได้อย่างไร

ฉันใช้ MySQL 5


8
คุณไม่ควรใช้ ID ในการจัดเรียง (นั่นคือสมมติว่า ID ของคุณเป็นคอลัมน์ auto_increment) คุณควรสร้างคอลัมน์อื่นในตารางที่แสดงถึงลำดับการจัดเรียงอย่างชัดเจน
Decent Dabbler

คำตอบ:


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
ฉันคิดว่าแบบสอบถามย่อยควรเป็น (เลือก min (id) จาก foo โดยที่ id> 4) และ (เลือก max (id) จาก foo โดยที่ id <4)
Decent Dabbler

1
คุณพูดถูกฉันลืมประโยค FROM ขอบคุณที่ชี้ให้เห็น :)
longneck

2
นี่ไม่ใช่วิธีแก้ปัญหาเพราะถ้าคุณลบ row ออกจาก "foo" จะเกิดอะไรขึ้น? : P
Valentin Hristov

@valentinhristov ฉันไม่เข้าใจที่คุณพูด โปรดให้ตัวอย่าง
longneck

@longneck หากคุณโพสต์หลังจากบันทึกทุกอย่างเรียบร้อยดี แต่ถ้าคุณโพสต์เนื้อหาหลังจากรหัสเวอร์ชันไม่ใช่เกณฑ์สำหรับตำแหน่งตามลำดับ
Valentin Hristov

140

นอกจากโซลูชันของ cemkalyoncu แล้ว :

บันทึกต่อไป:

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ก็เพียงพอแล้ว อย่าใช้สิ่งนี้เป็นเครื่องมือในการพิจารณาว่ามีการเพิ่มระเบียนในภายหลัง (หรือก่อนหน้า) จริงหรือไม่ ในทางกลับกันให้พิจารณาใช้คอลัมน์วันที่และเวลาเพื่อจัดเรียงตามตัวอย่างเช่น


ฉันชอบคำตอบนี้มากฉันเรียงลำดับตามการประทับเวลาและหมายความว่าไม่มีการสืบค้นย่อยดังนั้นรวม 2 คำค้นหาแทนที่จะเป็น 4
มอริซ

61

โซลูชันทั้งหมดข้างต้นต้องการการเรียกฐานข้อมูลสองครั้ง โค้ด sql ด้านล่างรวมสองคำสั่ง sql เข้าด้วยกัน

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
ทางออกที่ดีที่สุดแน่นอน รวดเร็วและทั้งหมดในแบบสอบถามเดียว
ภูต

ทำงานได้อย่างสมบูรณ์แบบแม้ในแบบสอบถามที่ซับซ้อนมากขึ้น!
taiar

การเพิ่มDISTINCTก่อน*จะทำให้ดียิ่งขึ้นนั่นคือแน่นอนว่าidสามารถมี0ค่าได้
Ejaz

ทางออกที่ยอดเยี่ยม ในระเบียนแรกและครั้งสุดท้ายจะแสดงผลเดี่ยวidแทนที่จะเป็นสอง
lubosdz

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

1
+1 ฉันคิดว่านี่เป็นวิธีที่สะอาดที่สุด แต่ประโยค LIMIT ควรอยู่ในลำดับสุดท้าย: SELECT * FROM foo WHERE id> 4 ORDER BY id LIMIT 1
Decent Dabbler

และSELECT * FROM foo WHERE id<4 ORDER BY id DESC LIMIT 1สำหรับบันทึก previouse
fwonce

12

ฉันพยายามทำสิ่งที่คล้ายกันนี้ แต่ฉันต้องการผลลัพธ์ที่เรียงตามวันที่เนื่องจากฉันไม่สามารถใช้ฟิลด์ ID เป็นคอลัมน์ที่เรียงลำดับได้ นี่คือวิธีแก้ปัญหาที่ฉันคิดขึ้นมา

อันดับแรกเราจะค้นหาดัชนีของระเบียนที่ต้องการในตารางเมื่อจัดเรียงตามที่เราต้องการ:

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 เพื่อรับตัวแปรเป็นหนึ่งในพารามิเตอร์ได้


ฉันสนใจแนวทางของคุณ จะเกิดอะไรขึ้นถ้าคุณต้องการเข้าร่วมด้วย? พูดว่าจากบทความที่ผู้เขียนเข้าร่วม b ON b นี่ = a.that สำหรับฉันดูเหมือนว่า JOIN จะทำให้การสั่งซื้อยุ่งเหยิง นี่คือตัวอย่างpastebin.com/s7R62GYV
idrarig

1
ในการเข้าร่วมคุณต้องกำหนดตัวแปร @ สองแบบที่แตกต่างกัน `เลือก current.row, current.id, previous.row, previous.id จาก (SELECT @rownum: = @ rownum + 1 แถว a. * จากบทความ a, (SELECT @rownum: = 0) r ORDER BY date, id) เป็น current_row LEFT JOIN (SELECT @ rownum2: = @ rownum2 + 1 แถว a. * จากบทความ a, (SELECT @ rownum2: = 0) r ORDER BY date, id) เป็น previous_row ON (current_row.id = previous_row. id) AND (current_row.row = previous_row.row -1) `
Eduardo 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; 

หมายเหตุ:หากค่าไม่พบแล้วก็จะกลับnull

ในตัวอย่างข้างต้น ค่าก่อนหน้าจะเป็นRajaและค่าถัดไปจะเป็นโมฆะเนื่องจากไม่มีค่าถัดไป


7

ด้วยวิธีการของ @Dan คุณสามารถสร้าง JOIN ได้ เพียงใช้ @variable ที่แตกต่างกันสำหรับแบบสอบถามย่อยแต่ละรายการ

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
Ludovic Guillaume

แบบสอบถามนี้มีประโยชน์ในการค้นหาว่าระเบียนถูกลบออกจากตารางหรือไม่ (ลำดับของคอลัมน์รหัส auto_increment หมด) หรือไม่
ธรรมมัง

@LudovicGuillaume คุณสามารถเจาะจงได้มากกว่านี้ ฉันไม่เข้าใจคำพูดของคุณขออภัย แต่ข้อความค้นหาไม่มีองค์ประกอบใน previous_row *
Walter Schrabmair

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 และคุณจะได้รับข้อผิดพลาด MySQL คุณสามารถใช้ if-statement เพื่อป้องกันสิ่งนี้ได้ อย่าเลือกอะไรเลยเพราะไม่มีบันทึกก่อนหน้านี้อยู่แล้ว ในกรณีของระเบียนสุดท้ายจะมีแถวถัดไปและจะไม่มีผลลัพธ์

โปรดทราบว่าหากคุณใช้ DESC ในการสั่งซื้อแทนที่จะเป็น ASC คุณจะต้องสอบถามเพื่อเลือกแถวถัดไปและแถวก่อนหน้าจะยังคงเหมือนเดิม แต่มีการสลับ


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

ที่นี่เรามีวิธีดึงข้อมูลก่อนหน้าและถัดไปโดยใช้แบบสอบถาม MySQL เดียว โดยที่ 5 คือ id ของเร็กคอร์ดปัจจุบัน

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

จะรับบันทึกถัดไป / ก่อนหน้าใน MySQL & PHP ได้อย่างไร

ตัวอย่างของฉันคือรับ id เท่านั้น

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

Downvoted เพราะมันเป็นความเสี่ยงที่จะSQL Injection ฉันรู้ว่านี่เป็นโพสต์เก่า แต่นักพัฒนามือใหม่ควรทราบ
ayrtonvwf

2

การปรับแนวทาง @Don ให้เหมาะสมเพื่อใช้เพียงแบบสอบถามเดียว

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

นี่เป็นคำตอบที่มีประโยชน์ที่สุดที่ฉันพบในที่นี้ การปรับปรุงจริงเท่านั้นที่ฉันแนะนำคือการใช้ตัวแปรและย้ายส่วนที่ไม่ซ้ำกันทั้งหมดขึ้นไปด้านบนเพื่อให้แก้ไขได้ง่าย จากนั้นสามารถทำให้เป็นฟังก์ชันหรือกระบวนการที่อ้างถึงบ่อยได้อย่างง่ายดาย
liljoshu

1

มีเคล็ดลับอีกอย่างที่คุณสามารถใช้เพื่อแสดงคอลัมน์จากแถวก่อนหน้าโดยใช้ลำดับใดก็ได้ที่คุณต้องการโดยใช้ตัวแปรที่คล้ายกับเคล็ดลับ @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

เห็นได้ชัดว่าคอลัมน์ที่เลือกได้รับการประเมินตามลำดับดังนั้นขั้นแรกจะเป็นการเลือกตัวแปรที่บันทึกไว้จากนั้นอัปเดตตัวแปรเป็นแถวใหม่ (เลือกในกระบวนการ)

หมายเหตุ: ฉันไม่แน่ใจว่านี่เป็นพฤติกรรมที่กำหนดไว้ แต่ฉันใช้แล้วและได้ผล


1

หากคุณต้องการป้อนidข้อความค้นหาของคุณมากกว่าหนึ่งรายการและรับnext_idสิ่งเหล่านี้ทั้งหมด ...

กำหนดcur_idในฟิลด์ที่คุณเลือกจากนั้นป้อนให้กับแบบสอบถามย่อยที่next_idเข้าไปในฟิลด์เลือก next_idและจากนั้นเลือกเพียง

ใช้คำตอบ longneck เพื่อขจัดตะกรัน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
ยินดีต้อนรับสู่ StackOverflow คำตอบที่ประกอบด้วยโค้ดทั้งหมดแทบไม่มีประโยชน์ โปรดพิจารณาให้คำอธิบายว่าโค้ดของคุณใช้ทำอะไร เอกสารในรหัสและ / หรือชื่อตัวแปรเป็นภาษาอังกฤษก็มีประโยชน์เช่นกัน
Politank-Z

1

หากคุณมีคอลัมน์ดัชนีให้พูดว่า id คุณสามารถส่งคืน id ก่อนหน้าและถัดไปในคำขอ sql เดียว แทนที่: id ด้วยค่าของคุณ

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 ที่ดี

ฉันใช้ Codeigniter HMVC

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

Downvoted เพราะมันเป็นความเสี่ยงที่จะSQL Injection ฉันรู้ว่านี่เป็นโพสต์เก่า แต่นักพัฒนามือใหม่ควรทราบ
ayrtonvwf

0

นี่คือคำตอบของฉัน ฉันรับแนวคิดจาก ' Decent Dabbler ' และเพิ่มส่วนที่ตรวจสอบว่าidอยู่ระหว่าง min (id) และ max (id) หรือไม่ นี่คือส่วนสำหรับสร้างตารางของฉัน

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 ปี
Jakub Arnold

ฉันเพิ่งพบหัวข้อนี้เนื่องจากฉันมีปัญหาเดียวกันเมื่อเร็ว ๆ นี้
Dennis


-1

ฉันคิดว่าจะมีแถวถัดไปหรือก่อนหน้าจริงในตาราง SQL เราต้องการค่าจริงที่มีค่าเท่ากัน (<หรือ>) จะส่งคืนมากกว่าหนึ่งหากคุณต้องการเปลี่ยนตำแหน่งของแถวในตารางการสั่งซื้อ

เราต้องการค่า$positionเพื่อค้นหาneighboursแถวในตารางของฉันฉันสร้างคอลัมน์ 'ตำแหน่ง'

และแบบสอบถาม 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

ถ้าแถวถูกลบสิ่งนี้จะพัง เช่น: ถ้า ID เป็นหมายเลข 1,2,6,7,8
Kevin Waterson

-2

เลือกอันดับ 1 * จาก foo โดยที่ id> 4 เรียงลำดับตาม id asc


1
MySQL เทียบเท่าคือ "LIMIT 1": select * from foo where id>4 order by id asc LIMIT 1
ม็อบ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.