การ 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 ด้านบน ตามตารางนี้
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
idfield_nameABS(id-5)
1ไฟล์ดาวน์โหลด4
2คุณรู้บ้างไหม3
3กฎหมายฮาๆ ของอเมริกา2
4การทำ from logig ด้วย php กับฐานข้อมูล oracle1
5สุดยอดหลุม0
6มาเร่งความเร็วเว็บเราด้วย htaccess กัน1
7แหล่งรวม Text Books สำหรับ WebDeveloper และ Programer ทั้งหลาย2
8subdomain(by samyuranun)by webmaster[cs siam edu]3
9Regular Expressions Tutorial4
10php 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 เป็นรายการอื่น ตามข้อกำหนดด้านบนดูครับ)
                                                                                                                                                                                                                                                                                                                  
idfield_namep
3กฎหมายฮาๆ ของอเมริกา2
4การทำ from logig ด้วย php กับฐานข้อมูล oracle1
6มาเร่งความเร็วเว็บเราด้วย htaccess กัน1
7แหล่งรวม Text Books สำหรับ WebDeveloper และ Programer ทั้งหลาย2
ผู้เขียน Goragod โพสต์เมื่อ 15 พ.ค. 2558 เปิดดู 1,377 ป้ายกำกับ SQL

เรื่องที่เกี่ยวข้อง

^