การ Query ข้อมูลใกล้เคียงตามจำนวนที่กำหนด

จากบทความ "การ Query ข้อมูลลำดับก่อนหน้าและลำดับถัดไป" วิธีนี้ มีข้อสังเกตได้ว่าหากรายการที่ต้องการเป็นรายการแรก หรือรายการสุดท้าย ตัว Query จะให้ผลลัพท์เพียง record เดียว แต่ในบางครั้งเราอาจต้องการรายการในจำนวนที่คงที่เสมอ เช่น ต้องรายการใกล้เคียงจำนวน 4 รายการทุกครั้ง เช่น
1,2,3,4,5,6,7,8,9,10

รายการที่ต้องการคือ 5 และ รายการใกล้เคียง 4 รายการคือ 3,4,6 และ 7
1,2,3,4,5,6,7,8,9,10

รายการที่ต้องการคือ 9 และ รายการใกล้เคียง 4 รายการคือ 6,7,8 และ 10 (ถัดไป 1 รายการ และ ก่อนหน้า 3 รายการ)
1,2,3,4,5,6,7,8,9,10

รายการที่ต้องการคือ 10 ซึ่งเป็นรายการสุดท้าย ผลลัพท์รายการใกล้เคียง 4 รายการจะเป็นรายการก่อนหน้าทั้งหมด คือ 6,7,8 และ 9

จากความต้องการด้านบน เรามีพระเอกขี่ม้าขาวมาช่วย ซึ่งก็คือฟังก์ชั่น ABS() ของ MySQL
SELECT id,field_name,ABS(id-5) FROM table_name

จากคำสั่งด้านบน ถ้ารายการที่ต้องการคือ id=5 เราจะได้ผลลัพท์ของ query ด้านบน ตามตารางนี้
 
id field_name ABS(id-5)
1 ไฟล์ดาวน์โหลด 4
2 คุณรู้บ้างไหม 3
3 กฎหมายฮาๆ ของอเมริกา 2
4 การทำ from logig ด้วย php กับฐานข้อมูล oracle 1
5 สุดยอดหลุม 0
6 มาเร่งความเร็วเว็บเราด้วย htaccess กัน 1
7 แหล่งรวม Text Books สำหรับ WebDeveloper และ Programer ทั้งหลาย 2
8 subdomain(by samyuranun)by webmaster[cs siam edu] 3
9 Regular Expressions Tutorial 4
10 php ini recommend settings[by SamYuranun] 5

สังเกตุนะครับว่ารายการเป้าหมาย (5) ได้ผลลัพท์จาก ABS() เป็น 0 ซึ่งถ้าดูจากผลลัพท์หมายความว่ารายการใกล้เคียงคือรายการที่ ABS() เป็น 1 และ 2
SELECT * FROM ( <= SELECT ชั้นนอกใช้เพื่อเรียงลำดับผลลัท์ตาม id
SELECT id,field_name,ABS(id-5) AS p
FROM table_name
WHERE id!=5 <= ไม่รวมรายการที่ต้องการ
ORDER BY p <= เรียงลำดับตาม ABS()
LIMIT 4
) AS Q ORDER BY id

ผลลัพท์ของ Query จะได้ตามตารางด้านล่าง ซึ่งจะมีจำนวนจะคงที่ 4 รายการเสมอ (ลองเปลี่ยน id เป็นรายการอื่น ตามข้อกำหนดด้านบนดูครับ)
 
id field_name p
3 กฎหมายฮาๆ ของอเมริกา 2
4 การทำ from logig ด้วย php กับฐานข้อมูล oracle 1
6 มาเร่งความเร็วเว็บเราด้วย htaccess กัน 1
7 แหล่งรวม Text Books สำหรับ WebDeveloper และ Programer ทั้งหลาย 2
ผู้เขียน goragod โพสต์เมื่อ 15 พ.ค. 2558 เปิดดู 7,935 ป้ายกำกับ SQL
^