การ 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

ความคิดเห็น 0

เปิดดู 1,159

ป้ายกำกับ SQL

Related

^