ผมมีเรื่องจะเล่าให้ฟัง ผมได้ออกแบบฐานข้อมูลตัว มีตารางชื่อ 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