ผมมีเรื่องจะเล่าให้ฟัง ผมได้ออกแบบฐานข้อมูลตัว มีตารางชื่อ tbl_order มีฟิลด์ๆหนึ่ง ชื่อ order_status ทำหน้าที่เก็บสถานะของใบออเดอร์ ผมจะเก็บ back-order-1,back-order-2,back-order-3 ไปเรื่อยๆ
และแล้ววันนี้ ผมต้องการเขียนคำสั่ง ให้มันจัดเรียงตาม order_status จากน้อยไปหามาก ผลปรากฎว่า มันจัดเรียงออกมาดังนี้
back-order-1
back-order-10
back-order-2
มันก็เรียงถูกต้องตามหลักการเรียงสตริง แต่มันไม่่ใช่สิ่งที่ผมต้องการ ผมต้องการอย่างนี้
back-order-1
back-order-2
back-order-10
แล้วท่านก็ไม่ต้องตั้งข้อสังเกตุนะครับว่า เอ… แล้วทำไมไม่ออกแบบฐานข้อมูลอย่างนั้นอย่างนี้ เหตุผลมันมีเยอะครับ เอาเป็นว่าในเมื่อฟิลด์ order_status ผมออกแบบให้มันเก็บ string แล้วและก็ใส่ข้อมูล back-order-1,back-order-2,back-order-10 ไปแล้ว
ก็มันแล้วไปแล้ว
ก็ต้องหาวิธีจัดเรียงมันให้ตรงกับที่ต้องการให้ได้ ผมเขียนคำสั่ง ดังนี้ครับ ผลที่ออกมาก็ตรงใจทุกประการ
SELECT * , ROUND( SUBSTRING( order_status , 12 ) ) AS val FROM tbl_order ORDER BY val ASC |
ความหมายของคำสั่งคือ
ให้เลือกข้อมูลทุกฟิลด์และ ตัดสตริงในฟิลด์ order_status ตั้งแต่ตัวที่ 12 (back-order- = 11 ตัว) จนไปถึงตัวสุดท้ายออกมา แล้วแปลงเป็นตัวเลข เก็บไว้ในฟิลด์ชั่วคราว ชื่อ val
จากตาราง tbl_order
จัดเรียงโดยใช้ข้อมูลในฟิลด์ val จากน้อยไปหามาก
ฟังก์ชั่น SUBSTRING() ของ mySQL นั้นใช้สำหรับตัดตัวอักษรออกมาจากสตริงที่เราต้องการ หรือจะกล่าวอีกนัยยะหนึ่งก็ได้ว่า ไว้สำหรับตัดตัวอักษรออกจากข้อมูลในฟิลด์ที่ต้องการ และยังสามารถนำไปประยุกต์ได้อีกเยอะครับรู้จักมันไว้ไม่เสียหาย คำสั่งนี้มีท่านอื่นๆ เขียนอธิบายไว้ค่อนข้างละเอียดแล้ว เพราะฉะนั้นการใช้งานตามหลักไวยากรณ์ของมัน ผมจะทิ้งลิ้งก์แนะนำให้ท่านเข้าไปอ่านเพิ่มเติมนะครับ
SQL Command SUBSTR,ORDER BY ที่ไม่ค่อยคุ้นแต่สำัคัญ
SQL SUBSTRING
pp says:
11/05/2553 at 11/05/2553
พี่ช่วยตอบหน่อยค่ะ
หากว่าเราต้องการรับค่า String จาก User มา 5 ค่า
แล้วให้แสดงผลลัพธ์ออกมาโดยเรียงลำดับจากน้อยไปหามาก
เราจะมีวิธีการเขียนอย่างไร
– ช่วยตอบด้วยนะคะ
administrator says:
11/05/2553 at 11/05/2553
ใช้คำสั่ง order by ธรรมดาๆมันไม่ออกเหรอครับ
http://www.select2web.com/sql/order-by-keyword.html
kengclubza says:
10/04/2554 at 10/04/2554
ขอบคุณมากครับ สุดยอดเลยตามหาอยู่พอดี